org.hibernate.loader.MultipleBagFetchException: kann nicht mehrere Taschen gleichzeitig abrufen

7

Das ist mein Code Hier verwende ich mehrere Listen, um Daten aus der Datenbank zu holen. Beim Abrufen von Daten aus der hql-Abfrage wird eine Ausnahme angezeigt.

Pojo-Klasse

%Vor%

hmb.xml-Datei

%Vor%

Hql-Abfrage

%Vor%

Ich versuche folgende Abfrage, um Daten aus der Datenbank abzurufen, aber dies wird angezeigt %Code% Wie man das löst

    
xrcwrn 10.07.2014, 11:26
quelle

5 Antworten

16

Wie in dieser Artikel , Hibernate erlaubt es nicht mehr als eine Tasche holen denn das würde ein cartesianischen Produkt erzeugen.

Sie können die Taschen-Sets, ändern und ein order-by="id" Attribut ‚Simulieren‘ eine geordnete Liste Verhalten hinzufügen:

%Vor%

Aber nur weil du es kannst, heißt das nicht, dass du es solltest.

Was könnten Sie tun, ist höchstens eine Sammlung in der ursprünglichen SQL-Abfrage zu holen, während die anderen Sammlungen später mit sekundären Abfragen abgerufen werden. Auf diese Weise können Sie das kartesische Produkt vermeiden.

Eine weitere Option ist Multi-Level zu verwenden, von Kind zu holen bis zu Muttergesellschaften .

    
Vlad Mihalcea 10.07.2014, 12:39
quelle
14

Bei mir hatte ich den gleichen Fehler und löste das durch Hinzufügen der Annotation von Hibernate @Fetch

%Vor%     
BERGUIGA Mohamed Amine 19.07.2015 16:24
quelle
2

Sie können nur nach einer Relation für eine Entität eine Verknüpfung erstellen (entweder billPaidDetailses oder billProductList ).

Ziehen Sie die Verwendung von faulen Verknüpfungen und das Laden von Auflistungen in Betracht, wenn sie benötigt werden ODER verwenden Sie faule Verknüpfungen und das manuelle Laden von Sammlungen mit Hibernate.initialize(..) . Zumindest war das die Schlussfolgerung, zu der ich kam, als ich ein ähnliches Problem hatte.

.

In jedem Fall wird mehr als eine Abfrage zur Datenbank benötigt.

    
enlait 10.07.2014 11:56
quelle
1

Der Wechsel zu Set ist die beste Lösung. Wenn Sie jedoch die List nicht durch Set ersetzen können (wie in meinem Fall gab es eine starke Verwendung von JSF-Tags, die für Lists spezifisch sind) und wenn Sie proprietäre Hibernate-Annotationen verwenden können, können Sie% co_de angeben %. Diese Lösung funktionierte besser für mich, die Umstellung auf @IndexColumn (name = "INDEX_COL") würde Tonnen von Refactoring erfordern.

Also, Ihr Code wäre etwa so:

%Vor%

Wie Igor in den Kommentaren vorgeschlagen hat, könnten Sie auch Proxy-Methoden erstellen, um die Listen zurückzugeben. Ich habe das nicht ausprobiert, wäre aber eine gute Alternative, wenn Sie keine Hibernate-proprietären Annotationen verwenden können.

    
Leo Holanda 15.10.2014 22:22
quelle
0

Ihre Anfrage holt zu viele Daten und HIbernate kann nicht alle laden. Reduzieren Sie Ihre Anfrage und / oder konfigurieren Sie Ihre Entitäten, um nur benötigte Daten abzurufen

    
Pracede 10.07.2014 11:33
quelle