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!