gpt4 book ai didi

java - Hibernate 抛出 MultipleBagFetchException - 不能同时获取多个包

转载 作者:bug小助手 更新时间:2023-10-28 01:38:13 34 4
gpt4 key购买 nike

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 所述!

关于java - Hibernate 抛出 MultipleBagFetchException - 不能同时获取多个包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4334970/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com