休眠圈出的实体[重复]

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 中回答了,不允许我选择其他答案,我不知道这是否也回答了问题,所以我奖励了试图提供帮助的人!

以上是关于休眠圈出的实体[重复]的主要内容,如果未能解决你的问题,请参考以下文章

休眠映射异常:实体映射中的重复列

在选择期间休眠重复的行

如何取消代理休眠对象[重复]

具有 OneToMany 关系的休眠重复条目

超过两个实体的休眠复杂查询

休眠保存实体