具有两个以上OneToMany字段的Hibernate实体

t77*_*777 2 java hibernate hibernate-mapping

我有以下hibernate实体:

@Entity
public class Customer {

    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Address> addresses = new ArrayList<>();

    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Contact> contacts = new ArrayList<>();

    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Name> names = new ArrayList<>();

    // Many more, including a primary key
}
Run Code Online (Sandbox Code Playgroud)

启动应用程序,我得到以下异常:

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
Run Code Online (Sandbox Code Playgroud)

如果我删除一个仲裁OneToMany协会,或者如果我添加一个@Fetch(value = FetchMode.JOIN)仲裁OneToMany协会,一切正常.

这是一个hibernate错误,一个hibernate限制,还是我的实体有什么问题?TIA!

v.l*_*nev 5

这不是一个bug.这是因为Hibernate使用一个带连接的select来获取所有数据.Hibernate可以连接三个或更多表,但是连接的结果将具有重复的Address列,例如列.Hibernate需要删除重复项 - 这是Set工作原因.

可能的解决方法:

  • Set<Address>而不是List<Address>.您应该Set用于所有集合.
  • 使用延迟抓取 fetch = FetchType.LAZY
  • 使用 @Fetch(value = FetchMode.SUBSELECT)

一些额外的阅读:

Hibernate Set和List行为的初学者指南

对于集合启用了外连接提取的查询,Hibernate不会返回不同的结果(即使我使用distinct关键字)?