首页 > 解决方案 > 休眠圈出的实体

问题描述

直截了当:我有一个包含项目的组。我希望使用外键处理该关联,这就是它具有 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。

任何帮助表示赞赏。

标签: javahibernatejpalazy-initialization

解决方案


当事务结束时,您将获得所有未获取的对象的 LazyInitializationEXception。

如果您使用查询添加连接获取对象,例如:

select p from Project p join fetch p.group g

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

尽可能使用 FetchType.LAZY 来防止这种情况发生,特别是如果是列表。


推荐阅读