Hibernate在创建SessionFactory时抛出这个异常:

multiplebagfetchexception:不能同时获取多个包

这是我的测试用例:

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;

}

这个问题怎么样?我该怎么办?


EDIT

好的,我的问题是,另一个“父”实体是在我的父,我的真实行为是这样的:

Parent.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不喜欢FetchType有两个集合。EAGER,但这似乎是一个bug,我没有做不寻常的事情…

删除FetchType。来自Parent或AnotherParent的渴望解决了这个问题,但我需要它,所以真正的解决方案是使用@LazyCollection(LazyCollectionOption.FALSE)而不是FetchType(感谢Bozho的解决方案)。


当前回答

你可以使用一个新的注释来解决这个问题:

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

实际上,fetch的默认值是FetchType。懒惰。

其他回答

我认为hibernate的新版本(支持JPA 2.0)应该可以处理这个问题。但除此之外,你可以通过注释集合字段来解决它:

@LazyCollection(LazyCollectionOption.FALSE)

记住要从@*ToMany注释中删除fetchType属性。

但请注意,在大多数情况下,Set<Child>比List<Child>更合适,所以除非你真的需要List -选择Set

但请记住,使用集合时,你不会消除Vlad Mihalcea在他的回答中所描述的底层笛卡尔积!

好吧,这是我的2美分。我在我的实体中有Fetch Lazy注释,但我也在会话bean中复制了Fetch Lazy,从而导致了多个包问题。因此,我只是删除了SessionBean中的行

标准。createAlias("FIELD", "ALIAS", JoinType.LEFT_OUTER_JOIN);/ /删除

我使用了Hibernate。在list parent = criteria之后,我想检索的列表上的初始化。List被调用。 Hibernate.initialize (parent.getChildList ());

你可以使用一个新的注释来解决这个问题:

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

实际上,fetch的默认值是FetchType。懒惰。

在尝试了这篇文章和其他文章中描述的每一个选项后,我得出的结论是,解决方案如下。

在每个XToMany地方@XXXToMany(mappedBy="parent", fetch=FetchType.EAGER) 在中间之后

@Fetch(value = FetchMode.SUBSELECT)

这对我很有效

同时注释Fetch和LazyCollection有时有助于运行项目。

@Fetch(FetchMode.JOIN)
@LazyCollection(LazyCollectionOption.FALSE)