休眠圈出的实体[重复]
Posted
技术标签:
【中文标题】休眠圈出的实体[重复]【英文标题】:Hibernate circled entities [duplicate] 【发布时间】:2019-10-27 22:37:34 【问题描述】:直截了当: 我有一个包含项目的组。我希望使用外键处理该关联,这就是它具有 mappedby 标记的原因。我的问题是,如果我查询组,我会进入一个无限循环,其中组列出了包含该组的项目,该组列出了再次包含该组的项目......等等。我的实体(最小版本):
@Entity
public class DBGroup
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
@OneToMany(mappedBy = "group",cascade=CascadeType.ALL,fetch = FetchType.EAGER)
private List<Project> projects = new ArrayList<>();
@Entity
public class Project
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn//added this because i read somewhere this would help somehow but it didnt
private DBGroup group;
谁能帮助避免这个循环?如果我在 DBGroup 中将 fetchtype 更改为惰性,我会得到一个 LazyInitializationEXception。
感谢任何帮助。
【问题讨论】:
另一个完美的例子为什么你不应该使用FetchType.EAGER
所以如果我使用 Lazy FetchType,这个设置会起作用吗?这意味着我需要以某种方式修复 LazyInitializationException
在哪里陷入无限循环?加载后,您对实体做什么?序列化为 JSON?
LazyInitializationException
很容易通过不访问事务/会话之外的属性来修复。因此,要么在离开事务之前手动加载深度 X(通过简单地访问属性),要么总是打开一个新的事务/会话来获取丢失的数据
但我正在使用结果来形成 JAX-RS 响应。它将它转换为一个 json 对象,并且我相信它必须遍历所有属性,因此我无法控制它
【参考方案1】:
当事务结束时,您会为所有未获取的对象获得一个 LazyInitializationEXception。
如果您通过查询获取对象,请添加连接提取,例如:
select p from Project p join fetch p.group g
您可以在退出 ejb 之前通过调用 size 方法的代码获取列表。
尽可能使用 FetchType.LAZY 来防止这种情况发生,尤其是列表时。
【讨论】:
当它无法回答原始问题时,它怎么能成为公认的答案? 好吧,你们其他人在 cmets 中回答了,不允许我选择其他答案,我不知道这是否也回答了问题,所以我奖励了试图提供帮助的人!以上是关于休眠圈出的实体[重复]的主要内容,如果未能解决你的问题,请参考以下文章