【问题标题】: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 对象,并且我相信它必须遍历所有属性,因此我无法控制它

标签: java hibernate jpa lazy-initialization


【解决方案1】:

当事务结束时,您会为所有未获取的对象获得一个 LazyInitializationEXception。

如果您通过查询获取对象,请添加连接提取,例如:

select p from Project p join fetch p.group g

您可以在退出 ejb 之前通过调用 size 方法的代码获取列表。

尽可能使用 FetchType.LAZY 来防止这种情况发生,尤其是列表时。

【讨论】:

  • 当它无法回答原始问题时,它怎么能成为公认的答案?
  • 好吧,你们其他人在 cmets 中回答了,不允许我选择其他答案,我不知道这是否也回答了问题,所以我奖励了试图提供帮助的人!
猜你喜欢
  • 2016-11-20
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多