【问题标题】:JPA lazy initialization exception for different providers不同提供者的 JPA 延迟初始化异常
【发布时间】:2018-06-22 21:02:20
【问题描述】:

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

【问题讨论】:

  • 'lazy' 只是对 JPA 提供者的建议。可以严格使用,也可以不严格使用

标签: hibernate jpa eclipselink


【解决方案1】:

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

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

直接使用 Google 搜索会显示更多结果。

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

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

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2012-07-27
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多