615 Stimmen

Hibernate löst MultipleBagFetchException aus - kann nicht gleichzeitig mehrere Beutel abrufen

Hibernate löst diese Ausnahme bei der Erstellung der SessionFactory aus:

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

Dies ist mein Testfall:

Elternteil.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 // @IndexColumn(name="INDEX_COL") if I had this the problem solve but I retrieve more children than I have, one child is null.
 private List<Child> children;

}

Kind.java

@Entity
public Child {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private Parent parent;

}

Was ist mit diesem Problem? Was kann ich tun?


EDITAR

OK, das Problem, das ich habe, ist, dass eine andere "übergeordnete" Entität innerhalb meiner übergeordneten ist, mein wirkliches Verhalten ist dies:

Elternteil.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private AnotherParent anotherParent;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<Child> children;

}

AnotherParent.java

@Entity
public AnotherParent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<AnotherChild> anotherChildren;

}

Hibernate mag keine zwei Sammlungen mit FetchType.EAGER aber das scheint ein Fehler zu sein, ich mache keine ungewöhnlichen Dinge...

Entfernen von FetchType.EAGER de Parent o AnotherParent löst das Problem, aber ich brauche es, also ist die wirkliche Lösung die Verwendung von @LazyCollection(LazyCollectionOption.FALSE) anstelle von FetchType (Dank an Bozho für die Lösung).

2 Stimmen

Ich würde fragen, welche SQL-Abfrage Sie zu erstellen hoffen, die zwei separate Sammlungen gleichzeitig abruft? Die Arten von SQL, mit denen dies möglich wäre, würden entweder eine kartesische Verknüpfung (potenziell höchst ineffizient) oder eine UNION disjunkter Spalten (ebenfalls hässlich) erfordern. Vermutlich hat die Unfähigkeit, dies in SQL auf eine saubere und effiziente Weise zu erreichen, das API-Design beeinflusst.

0 Stimmen

@ThomasW Dies sind die Sql-Abfragen, die das Programm generieren sollte: select * from master; select * from child1 where master_id = :master_id; select * from child2 where master_id = :master_id

2 Stimmen

Ein ähnlicher Fehler kann auftreten, wenn Sie mehr als eine List<child> con fetchType definiert für mehr als eine List<clield>

0voto

Antonio Petricca Punkte 6313

Ich habe das Problem durch Anmerkungen gelöst:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)

0voto

Karen Hechter Punkte 21

Ok, hier sind meine 2 Cents. Ich hatte die Fetch Lazy Annotations in meiner Entität, aber ich habe auch die Fetch Lazy in der Session Bean dupliziert und damit ein Multiple Bag Problem verursacht. Also habe ich einfach die Zeilen in meiner SessionBean entfernt

criteria.createAlias("FELD", "ALIAS", JoinType.LEFT_OUTER_JOIN); //REMOVED

Und ich habe Hibernate.initialize für die Liste verwendet, die ich abrufen wollte, nachdem die Liste parent = criteria.list aufgerufen wurde. Hibernate.initialize(parent.getChildList());

-5voto

leee41 Punkte 1

Sie könnten eine neue Anmerkung verwenden, um dieses Problem zu lösen:

@XXXToXXX(targetEntity = XXXX.class, fetch = FetchType.LAZY)

Der Standardwert von fetch ist ebenfalls FetchType.LAZY.

5 Stimmen

JPA3.0 existiert nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X