在em.close()之后,延迟加载的实体会发生什么?

时间:2017-10-28 22:50:18

标签: java jpa eclipselink

我有一些实体和延迟加载的引用。

EntityA {

@ManyToMany
private List<EntityB> bs;

}

EntityB {

@ManyToMany
private List<EntityA> as;

}

我想知道是否保存以访问持久性上下文(PC)之外的那些懒惰集合,如果它们之前已经加载到PC中了? E.g。

// put into PC
a = em.merge(a);
// trigger lazy loading
a.bs.size();
em.close();
// access outside PC
a.bs.size();

我使用EclipseLink做了一个小测试,这似乎有效。但我不确定这是因为:

  1. 懒惰列表使用弱引用存储,现在可以访问,但可能会在某些时候进行GC操作,
  2. 即使实体不在PC中(无论出于何种原因),也会从数据库中提取延迟列表,
  3. 即使数据库将被关闭,也会启动懒惰列表,并且可以随时访问它们。

1 个答案:

答案 0 :(得分:3)

当EMF打开时,EclipseLink会保持与数据存储区的连接,即使EM已关闭,因此在关闭EMF之前,仍然可以加载延迟字段。这可以说是违反了JPA规范,许多人认为这是一种反模式。

其他JPA提供商将这样做,因此,如果您希望100%符合JPA标准,则不应该依赖它并确保在EM关闭之前加载惰性字段。如果某个字段尚未被EM关闭,那么访问它可能会引发异常(取决于JPA提供者)。