Hibernate不能同时获取多个包吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (9)
  • 关注 (0)
  • 查看 (94)

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;

}

这个问题怎么样?我能做什么?

编辑

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

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不喜欢两个FetchType.EAGER但这好像是个虫子我没做什么不寻常的事.

移除FetchType.EAGERParentAnotherParent解决问题,但我需要它,所以真正的解决办法是使用@LazyCollection(LazyCollectionOption.FALSE)而不是FetchType

提问于
用户回答回答于

我认为更新版本的Hibernate(支持JPA 2.0)应该处理这个问题。但是,否则你可以通过用以下内容注释集合字段来解决这个问题:

@LazyCollection(LazyCollectionOption.FALSE)

请记住移除fetchType属性的@*ToMany注释

但请注意,在大多数情况下,Set<Child>List<Child>所以除非你真的需要List-去争取Set

用户回答回答于

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

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

实际上,FETCH的默认值是FetchType。

用户回答回答于

如果你有太复杂的带有saveral集合的对象,那么让它们都具有急切的取类型可能不是个好主意,那么最好使用惰性,当你真的需要加载集合时,请使用:Hibernate.initialize(parent.child)去取数据。

用户回答回答于

你可以在jpa中保留Booth急切列表,并向其中至少一个添加jpa注释。@OrderColumn(显然是要排序的字段的名称)。不需要特定的Hibernate注释。但请记住,如果所选字段没有从0开始的值,则可以在列表中创建空元素。

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

在 Children 中你应该添加orderIndex字段

用户回答回答于

要解决这个问题,只需Set代替List用于嵌套对象。

@OneToMany
Set<Your_object> objectList;

别忘了用fetch=FetchType.EAGER

看起来不错

还有一个概念CollectionId如果你只想继续使用列表,则在Hibernate中。

用户回答回答于

在尝试了本文和其他文章中描述的每一个选项之后,我得出了这样的结论:修复是如下所示。

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

@Fetch(value = FetchMode.SUBSELECT)

这对我有用

用户回答回答于

或者,在代码中添加一个Hibernate特定的@FETCH注释:

@OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
private List<Child> childs;

这将修复与Hibernate bug hhh-1718相关的问题。

用户回答回答于

所属标签

可能回答问题的人

  • 天使的炫翼

    15 粉丝531 提问35 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问27 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券