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的解决方案)。


当前回答

简单地从列表类型更改为设置类型。

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

其他回答

您可以在JPA中保留摊位EAGER列表,并向其中至少一个添加JPA注释@OrderColumn(显然是要排序的字段的名称)。不需要特定的hibernate注释。 但是请记住,如果所选字段没有从0开始的值,它可能会在列表中创建空元素

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

在Children中,你应该添加orderIndex字段

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

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

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

关于@LazyCollection(LazyCollectionOption.FALSE)的一个好处是,在FetchType时,几个带有此注释的字段可以共存。即使在这种共存是合法的情况下,EAGER也不能。

例如,一个订单可能有一个OrderGroup列表(一个短的)以及一个促销列表(也是短的)。@LazyCollection(LazyCollectionOption.FALSE)可以同时使用,而不会导致LazyInitializationException和MultipleBagFetchException。

在我的情况下@Fetch确实解决了我的MultipleBacFetchException问题,但随后导致LazyInitializationException,臭名昭著的无会话错误。

在我这边,当我使用FetchType有多个集合时就发生了这种情况。热切的,像这样:

@ManyToMany(fetch = FetchType.EAGER, targetEntity = className.class)
@JoinColumn(name = "myClass_id")
@JsonView(SerializationView.Summary.class)
private Collection<Model> ModelObjects;

此外,集合连接在同一列上。

为了解决这个问题,我将其中一个集合更改为FetchType。LAZY,因为它适合我的用例。

古德勒克! ~ J

当你有一个太复杂的对象和一个简单的收集不是一个好主意,所有的对象都用EAGER fetchType,最好使用LAZY,当你真的需要加载集合使用:Hibernate.initialize(parent.child)来获取数据。