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

标签 java jpa eclipselink

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

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 做了一个小测试,这似乎有效。但我不确定这是不是因为:

  1. 惰性列表使用弱引用存储,目前可以访问,但可能会在某些时候被 GCed,
  2. 惰性列表是从数据库中获取的,即使实体不在 PC 中(无论出于何种原因),
  3. lazy-Lists 已启动并且可以随时访问,即使数据库将关闭也是如此。

最佳答案

EclipseLink 在 EMF 打开时保持与数据存储的连接,即使在 EM 关闭时也是如此,因此在您关闭 EMF 之前仍然能够加载惰性字段。这可以说是违反 JPA 规范的,许多人认为它是一种反模式。

其他 JPA 提供商不会这样做,因此,如果您想 100% 符合 JPA 标准,则不应依赖它并确保在 EM 关闭之前加载延迟字段。如果 EM close 尚未加载某个字段,则访问它可能会引发异常(取决于 JPA 提供程序)。

关于java - 在 em.close() 之后延迟加载的实体会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995259/

相关文章:

jpa - 在 Spring Data JPA 中删除相同事务后插入

java - Zookeeper Network Ensemble 未正确启动

java - 互联网断开之前的广播接收器

java - 无法找到名为 'entityManagerFactory' 的 bean

java - EclipseLink:如何关闭 Multi-Tenancy ,即使我用@MultiTenant 注释实体

java - JPA:Eclipselink 不会在数据库中保留双向关系

java - 如何用java中的OOP设计一个RPG类系统?

java - 如何在apache tomcat中配置域名

java - 如何从 CollectionTable 中删除数据 | hibernate (日本)

java - 关联表的 JPA 映射,其中实体之一具有组合键