Hibernate 在创建 SessionFactory 期间抛出此异常:
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
这是我的测试用例:
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;
}
这个问题怎么样?我能做什么?
编辑
好的,我遇到的问题是另一个“父”实体在我的父级内部,我的真实行为是这样的:
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
的两个集合,但这似乎是一个错误,我没有做不寻常的事情......
Removing FetchType.EAGER
from Parent
or AnotherParent
解决了这个问题,但我需要它,所以真正的解决方案是使用 @LazyCollection(LazyCollectionOption.FALSE)
而不是 FetchType
(感谢 Bozho 的解决方案)。
我认为更新版本的 hibernate(支持 JPA 2.0)应该可以处理这个问题。但除此之外,您可以通过以下方式注释集合字段来解决它:
@LazyCollection(LazyCollectionOption.FALSE)
记得删除fetchType
来自 @*ToMany
的属性注释。
但请注意,在大多数情况下 Set<Child>
比 List<Child>
更合适, 所以除非你真的需要 List
- 前往 Set
但请注意,使用集合您不会消除底层 笛卡尔积,如 Vlad Mihalcea in his answer 所述!
我是一名优秀的程序员,十分优秀!