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

时间:2016-06-23 14:18:05

标签: 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
}

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

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

如果我删除了一个仲裁OneToMany关联,或者我将@Fetch(value = FetchMode.JOIN)添加到仲裁OneToMany关联,那么一切正常。

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

2 个答案:

答案 0 :(得分:5)

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

可能的解决方法:

  • 使用Set<Address>代替List<Address>。您应该对所有集合使用Set
  • 使用延迟抓取fetch = FetchType.LAZY
  • 使用@Fetch(value = FetchMode.SUBSELECT)

一些额外的阅读:

A beginner’s guide to Hibernate Set and List behavior

Hibernate does not return distinct results for a query with outer join fetching enabled for a collection (even if I use the distinct keyword)?

答案 1 :(得分:1)

尝试使用:

@OneToMany
@LazyCollection(value=LazyCollectionOption.TRUE)
private Collection<Name> names = new ArrayList<>();