Heim  >  Artikel  >  Java  >  Warum geben Hibernate-Kriterien doppelte Bestellungen mit FetchType.EAGER zurück?

Warum geben Hibernate-Kriterien doppelte Bestellungen mit FetchType.EAGER zurück?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 01:40:28659Durchsuche

Why Does Hibernate Criteria Return Duplicate Orders with FetchType.EAGER?

Hibernate-Kriterien geben doppelte Bestellungen mit FetchType.EAGER zurück

Berücksichtigen Sie die folgende Hibernate-Zuordnung:

@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}

Damit Zuordnung können Sie Bestellungen anhand ihres orderStatus-Felds filtern:

public List<Order> getOrderForProduct(OrderFilter orderFilter) {
    Criteria criteria = getHibernateSession()
            .createCriteria(Order.class)
            .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));
    return criteria.list();
}

Wenn der Abruftyp jedoch explizit auf EAGER festgelegt ist, enthält die resultierende Liste doppelte Bestellungen.

Der Grund für Duplikate

Mit FetchType.EAGER führt Hibernate eine Join-Operation durch, um die zugehörigen OrderTransactions eifrig abzurufen. Infolgedessen wird jede Bestellung in der resultierenden Liste für jede zugehörige OrderTransaction dupliziert. Dies ist das erwartete Verhalten in diesem Szenario.

Eindeutige Ergebnisse erzielen

Um trotz des Eager Fetching eindeutige Bestellungen zu erhalten, können Sie den folgenden Code in Ihrer Kriterienabfrage verwenden:

Criteria criteria = getHibernateSession()
            .createCriteria(Order.class, "o")
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Zusätzliche Ressourcen

Weitere Erkenntnisse zu diesem Verhalten finden Sie in den folgenden Ressourcen:

  • [Hibernate-FAQ zu Distinct Ergebnisse für das Abrufen von Outer Joins](https://docs.jboss.org/hibernate/orm/5.3/javadocs/faq/FAQ.html#ch02s01)
  • [Gavin Kings Erklärung zu SQL Outer Joins und dem Verhalten im Ruhezustand ](http://www.hibernate.org/42.html)

Das obige ist der detaillierte Inhalt vonWarum geben Hibernate-Kriterien doppelte Bestellungen mit FetchType.EAGER zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn