gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:16:30 25 4
gpt4 key购买 nike

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

最佳答案

这不是一个错误。这是因为 Hibernate 使用带有连接的单选择来获取所有数据。 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)?

关于java - 具有两个以上 OneToMany 字段的 Hibernate 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994293/

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