不同提供者的 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
注释需要访问惰性关系的方法,以确保会话对您可用。
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
注释需要访问惰性关系的方法,以确保会话对您可用。