我有一些实体和延迟加载的引用。
EntityA {
@ManyToMany
private List<EntityB> bs;
}
EntityB {
@ManyToMany
private List<EntityA> as;
}
我想知道在持久性上下文 (PC) 之外访问那些惰性集合是否可以节省如果它们之前已加载到 PC 中? 例如
// put into PC
a = em.merge(a);
// trigger lazy loading
a.bs.size();
em.close();
// access outside PC
a.bs.size();
我用 EclipseLink 做了一个小测试,这似乎有效。但我不确定这是不是因为:
- 惰性列表使用弱引用存储,目前可以访问,但可能会在某些时候被 GCed,
- 惰性列表是从数据库中获取的,即使实体不在 PC 中(无论出于何种原因),
- lazy-Lists 已启动并且可以随时访问,即使数据库将关闭也是如此。
最佳答案
EclipseLink 在 EMF 打开时保持与数据存储的连接,即使在 EM 关闭时也是如此,因此在您关闭 EMF 之前仍然能够加载惰性字段。这可以说是违反 JPA 规范的,许多人认为它是一种反模式。
其他 JPA 提供商不会这样做,因此,如果您想 100% 符合 JPA 标准,则不应依赖它并确保在 EM 关闭之前加载延迟字段。如果 EM close 尚未加载某个字段,则访问它可能会引发异常(取决于 JPA 提供程序)。
关于java - 在 em.close() 之后延迟加载的实体会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995259/