Heim > Java > javaLernprogramm > ## Warum führen Hibernate-Kriterien mit FetchType.EAGER zu doppelten Bestellobjekten?

## Warum führen Hibernate-Kriterien mit FetchType.EAGER zu doppelten Bestellobjekten?

Mary-Kate Olsen
Freigeben: 2024-10-26 03:50:28
Original
626 Leute haben es durchsucht

## Why Does Hibernate Criteria with FetchType.EAGER Result in Duplicate Order Objects?

Hibernate Criteria gibt mehrere wiederholte Bestellungen mit FetchType.EAGER zurück

Problem:

Bei der Verwendung ein Hibernate-Kriterium mit FetchType.EAGER für eine Eins-zu-viele-Beziehung, die resultierende Liste enthält mehrere Kopien desselben Order-Objekts.

Originalcode:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>
Nach dem Login kopieren
Nach dem Login kopieren

Geänderter Code mit FetchType.EAGER:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>
Nach dem Login kopieren
Nach dem Login kopieren

Frage:

Warum führt der geänderte Code mit FetchType.EAGER zu mehreren Kopien des Order-Objekts?

Antwort:

Dieses Verhalten wird erwartet, wenn Eager Fetching aktiviert wird. Zwischen den Tabellen „Order“ und „OrderTransaction“ wird ein Join durchgeführt, der zur gleichen Anzahl von Zeilen führt wie ein regulärer SQL-Join. Daher erscheint jedes Order-Objekt entsprechend der Anzahl der zugehörigen OrderTransaction-Datensätze mehrmals.

Erklärung:

Beim Abrufen von Daten mit FetchType.EAGER wird ein äußerer Join verwendet . Dies bedeutet, dass eine Bestellung auch dann im Ergebnissatz enthalten ist, wenn sie keine zugehörigen OrderTransaction-Datensätze aufweist. Das Ergebnis ist eine Liste von Order-Objekten, die jeweils möglicherweise mehreren OrderTransaction-Objekten zugeordnet sind.

Lösung:

Um mehrere Kopien des Order-Objekts zu vermeiden, sollten Sie die Verwendung eines Sets in Betracht ziehen anstelle einer Liste, um Duplikate zu vermeiden. Alternativ können Sie eine DistinctRootEntity in der Kriterienabfrage verwenden, die explizit die eindeutigen Order-Objekte angibt, die zurückgegeben werden sollen.

Beispiel:

<code class="java">Criteria criteria = getHibernateSession()
        .createCriteria(Order.class)
        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
        .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt von## Warum führen Hibernate-Kriterien mit FetchType.EAGER zu doppelten Bestellobjekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage