我有以下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!
答案 0 :(得分:5)
这不是一个错误。这是因为Hibernate使用一个带连接的select来获取所有数据。 Hibernate可以连接三个或更多表,但加入的结果将包含重复项,例如Address
列。 Hibernate需要删除重复项 - 这是Set
工作的原因。
可能的解决方法:
Set<Address>
代替List<Address>
。您应该对所有集合使用Set
。fetch = FetchType.LAZY
@Fetch(value = FetchMode.SUBSELECT)
一些额外的阅读:
答案 1 :(得分:1)
尝试使用:
@OneToMany
@LazyCollection(value=LazyCollectionOption.TRUE)
private Collection<Name> names = new ArrayList<>();