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

问题描述 投票:2回答:2

我有以下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

如果我删除一个任意qazxsw poi协会,或者如果我将qazxsw poi添加到仲裁OneToMany协会,一切正常。

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

java hibernate hibernate-mapping
2个回答
5
投票

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

可能的解决方法:

  • 使用Address而不是Set。您应该将Set<Address>用于所有集合。
  • 使用懒惰抓取List<Address>
  • 使用Set

一些额外的阅读:

fetch = FetchType.LAZY

@Fetch(value = FetchMode.SUBSELECT)


© www.soinside.com 2019 - 2024. All rights reserved.