Heim  >  Artikel  >  Java  >  Warum geben Ruhezustandskriterien bei Verwendung von FetchType.EAGER mehrere Kopien untergeordneter Elemente zurück?

Warum geben Ruhezustandskriterien bei Verwendung von FetchType.EAGER mehrere Kopien untergeordneter Elemente zurück?

DDD
DDDOriginal
2024-10-27 04:29:29412Durchsuche

Why Does Hibernate Criteria Return Multiple Copies of Children When Using FetchType.EAGER?

Hibernate-Kriterien geben mehrere Kopien von untergeordneten Elementen mit FetchType.EAGER zurück

Beim Zuordnen einer Eins-zu-Viele-Beziehung in Hibernate, wie z Bei einer Order-Klasse mit einer Liste von OrderTransactions wird häufig die Einstellung FetchType.EAGER verwendet, um die untergeordneten Entitäten während der Initialisierung der übergeordneten Entitäten schnell abzurufen. Bei Verwendung dieser Einstellung mit Hibernate-Kriterien tritt jedoch ein merkwürdiges Phänomen auf.

Abfrageergebnisse für Wiederholungsbestellungen

Stellen Sie sich das folgende Szenario vor: Eine Order-Klasse wird mit einer Liste von definiert OrderTransactions, und eine Kriterienabfrage wird verwendet, um Bestellungen basierend auf ihrem orderStatus zu filtern. Mit der Standardeinstellung „FetchType.LAZY“ enthält die Ergebnisliste wie erwartet eindeutige Order-Instanzen. Aber wenn FetchType.EAGER für die OrderTransaction-Zuordnung festgelegt wird, erscheinen die Order-Instanzen mehrmals in den Ergebnissen.

Erwartetes Verhalten mit FetchType.EAGER

Obwohl das Verhalten von Wiederholte Bestellungen mit FetchType.EAGER mögen unerwartet erscheinen, es stimmt jedoch mit dem zugrunde liegenden SQL-Verhalten überein. Wenn ein äußerer Join durchgeführt wird (was aufgrund von FetchType.EAGER auftritt), enthält die Ergebnismenge alle möglichen Kombinationen von übergeordneten und untergeordneten Entitäten, was zu doppelten übergeordneten Instanzen führt, wenn mehrere untergeordnete Entitäten vorhanden sind.

Lösung

Um auch mit FetchType.EAGER eindeutige Bestellergebnisse zu erhalten, bietet Hibernate eine Problemumgehung:

<code class="java">Collection result = new LinkedHashSet(session.createCriteria(...).list());</code>

Dieses Code-Snippet verwendet ein LinkedHashSet, um doppelte Bestellreferenzen herauszufiltern und so sicherzustellen, dass das Ergebnis Die Liste enthält nur eindeutige Order-Instanzen.

Alternativ, wenn das Ziel darin besteht, das Abrufen von Joins vollständig zu verhindern und beim verzögerten Laden zu bleiben, setzen Sie einfach die FetchType-Einstellung zurück auf FetchType.LAZY.

Das obige ist der detaillierte Inhalt vonWarum geben Ruhezustandskriterien bei Verwendung von FetchType.EAGER mehrere Kopien untergeordneter Elemente 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