Heim  >  Artikel  >  Java  >  ## 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
Mary-Kate OlsenOriginal
2024-10-26 03:50:28490Durchsuche

## 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>

Geänderter Code mit FetchType.EAGER:

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

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>

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!

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