org.hibernate.loader.MultipleBagFetchException: kann nicht gleichzeitig mehrere Säcke Holen
Folgendes ist mein code Hier verwende ich mehrere Listen zum abrufen von Daten aus der Datenbank.
Auf das abrufen von Daten von hql-Abfrage ist es, zu zeigen Ausnahme.
Pojo-Klasse
public class BillDetails implements java.io.Serializable {
private Long billNo;
//other fields
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillPaidDetails> billPaidDetailses = new ArrayList<BillPaidDetails>();
private Set productReplacements = new HashSet(0);
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillProduct> billProductList = new ArrayList<BillProduct>();
//getter and setter
}
hmb.xml Datei
<class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop">
<id name="billNo" type="java.lang.Long">
<column name="bill_no" />
<generator class="identity" />
</id>
<bag name="billProductList" table="bill_product" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillProduct" />
</bag>
<bag name="billPaidDetailses" table="bill_paid_details" inverse="true" lazy="false" fetch="select">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillPaidDetails" />
</bag>
<set name="productReplacements" table="product_replacement" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.ProductReplacement" />
</set>
</class>
Hql-Abfrage
String hql = "select distinct bd,sum(bpds.amount) from BillDetails as bd "
+ "left join fetch bd.customerDetails as cd "
+ "left join fetch bd.billProductList as bpd "
+ "left join fetch bpd.product as pd "
+"left join fetch bd.billPaidDetailses as bpds "
+ "where bd.billNo=:id "
+ "and bd.client.id=:cid ";
Ich versuche folgende Abfrage zum abrufen von Daten aus der Datenbank aber das zeigt
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
Wie zu beheben dieses
- Haben Sie versucht, ändern Ihre Listen Setzt?
- Dieser Artikel kann dir helfen: blog.eyallupu.com/2010/06/...
- Was ist der name der eindeutigen id-Eigenschaft auf BillProduct?
- Anstelle der Liste mit Sets arbeiten. Aber ich will, zu tun, Liste
- Tun Sie wirklich brauchen, um die Listen verwenden?
- Wenn möglich mit Liste, dann möchte ich es zu benutzen.
- Gewählte einfache Art und Weise Konvertiert, die ganze Liste zu setzen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erläutert in dieser Artikel, Hibernate erlaubt nicht abrufen mehr als eine Tasche, weil generieren würde eine Kartesisches Produkt.
Ändern Sie können die Taschen-sets, und fügen Sie eine
order-by="id"
Attribut zu 'simulieren' eine geordnete Liste Verhalten:Aber nur weil du es kannst, es bedeutet nicht, sollten Sie.
Was Sie tun könnten, ist fetch bei den meisten eine Sammlung in der ursprünglichen SQL-Abfrage, während die anderen Sammlungen abgerufen werden danach mit sekundären Abfragen. Auf diese Weise vermeiden Sie das kartesische Produkt.
Andere Möglichkeit ist die Verwendung multi-level-Holen vom Kind bis zu den übergeordneten Entitäten.
Set
s blog.eyallupu.com/2010/06/... Auch, ändern Taschen-sets nicht machen join-fetch-query-Ergebnis weniger an ein Kartesisches Produkt, das von sich selbst kann ein Problem mit großen Sammlungen.Für mich, ich hatte den gleichen Fehler und ich gelöst indem die annotation von hibernate
@Fetch
Wechsel zu
Set
ist die beste Lösung. Allerdings, wenn Sie nicht ersetzen dieList
mitSet
(wie in meinem Fall, gab es einen schweren Einsatz des JSF-tags, die spezifischeLists
), und wenn Sie können, verwenden proprietäre Hibernate annotations, können Sie angeben@IndexColumn (name = "INDEX_COL")
. Diese Lösung funktionierte für mich besser, Wechsel zuSet
erfordern würde Tonnen von refactoring.So, würde der code so etwas wie dieses:
Als Igor vorgeschlagen, in den Kommentaren, man kann auch proxy-Methoden für die Rückgabe der Listen. Ich habe nicht versucht, wäre aber eine gute alternative, wenn Sie nicht verwenden proprietäre Hibernate-Annotationen.
Man kann nur join-fetch folgenden Zusammenhang für eine Person (entwederbillPaidDetailses
oderbillProductList
).Erwägen, faul, Verbänden und Sammlungen laden, wenn Sie benötigt werden, ODER mit faulen Verbände und be-Sammlungen manuell mit
Hibernate.initialize(..)
. Zumindest war das zu dem Schluss kam ich, als ich hatte eine ähnliches Problem.so oder so wird es mehr als eine Abfrage an die Datenbank.Ich habe die neue annotation @OrderColumn statt @IndexColumn (veraltet siehe: https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/annotations/IndexColumn.html) und es funktioniert jetzt.
Kommentieren Sie eine der Kollektionen mit @OrderColumn
z.B.
Ihre Anfrage Holen zu viele Daten und Ruhezustand kann nicht laden Sie Sie alle.
Reduzieren Sie Ihre Anfrage und/oder konfigurieren Sie Ihre Einheiten zum abrufen von gerade benötigten Daten