582 votes

Hibernate ne peut pas aller chercher plusieurs sacs simultanément

Hibernate génère cette exception au cours d'une SessionFactory création:

org.mise en veille prolongée.loader.MultipleBagFetchException: impossible d'extraire simultanément plusieurs sacs

C'est mon cas de test:

Parent.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;

}

Child.java

@Entity
public Child {

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

 @ManyToOne
 private Parent parent;

}

Comment à propos de ce problème? Que puis-je faire?


MODIFIER

OK, le problème que j'ai c'est que l'autre "parent" entité est à l'intérieur de mon parent, mon comportement est ceci:

Parent.java

@Entity
public Parent {

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

 @ManyToOne
 private AntoherParent anotherParent;

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

}

AnotherParent.java

@Entity
public AntoherParent {

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

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

}

Hibernate n'aime pas les deux collections FetchType.EAGER, mais cela semble être un bug, je ne vais pas faire des choses inhabituelles...

Retrait d' FetchType.EAGER de Parent ou AnotherParent résout le problème, mais j'en ai besoin, donc vraie solution est d'utiliser @LazyCollection(LazyCollectionOption.FALSE) au lieu de FetchType (grâce à Bozho pour la solution).

666voto

Bozho Points 273663

Je pense qu'une nouvelle version d'hibernate (supportant JPA 2.0) devrait gérer cela. Sinon, vous pouvez le contourner en annotant les champs de collection avec:

 @LazyCollection(LazyCollectionOption.FALSE)
 

N'oubliez pas de supprimer le fetchType attribut de la @*ToMany annotation.

Mais notez que dans la plupart des cas un Set<Child> est plus approprié que List<Child> , donc à moins que vous ayez vraiment besoin d'un List - allez pour Set

320voto

Ahmad Zyoud Points 688

Simplement changer de type de liste type de la valeur

180voto

DaveRlz Points 1710

Sinon, ajouter une annotation de @Fetch Hibernate-spécifique à votre code :

Cela devrait corriger le problème, lié à Hibernate bogue HHH-1718

46voto

Javier Points 41

Après avoir essayé avec toutes les options seule décrire dans ce messages et d’autres, je suis venu à la conclusion que le le fix est la suivante.

Dans tous les lieux XToMany @ `` et moyennement après

Cela a fonctionné pour moi

9voto

Christian Müller Points 161

J’ai trouvé un bon blog sur le comportement de mise en veille prolongée dans ce genre de mappages d’objet : http://blog.eyallupu.com/2010/06/hibernate-exception-simultaneously.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X