不同提供者的 JPA 延迟初始化异常

JPA lazy initialization exception for different providers

Hibernate 会发出很多惰性初始化异常,但 EclipseLink 不会。当分离实体并尝试访问未初始化的属性时,将发生异常。但这不是 EclipseLink 的问题。 EclipseLink 如何以不同方式处理它?

例如

public class Employee {

     @OneToMany(fetch=FetchType.LAZY)
     private List<Task> tasks; 
}

Employee employee = em.find(Employee.class, 1);
em.detach(employee);
employee.getTasks();   // exception here

我没有使用过 EclipseLink,但在阅读了 Hibernate LazyInitializationException 的原因后,我可以看出 EclipseLink 处理 lazy 加载关系的方式与 Hibernate 不同。

你可以在这里找到一些关于这个的答案:

  • Eclipselink Lazy Loading

  • JPA + EclipseLink - Lazy Loading with closed EntityManager

直接 Google 搜索将显示更多结果。

主要思想是即使在 EntityManager 关闭后,EclipseLink 也允许您访问惰性关系。据我所知,这是 EclipseLink 特定的行为和 JPA 的一部分。另一方面,Hibernate 需要打开会话才能初始化代理并访问惰性关系。

如果不存在则抛出异常。如果您正在使用 Spring,您始终可以使用 @Transactional 注释需要访问惰性关系的方法,以确保会话对您可用。