【问题标题】:JPA/Hibernate LEFT JOIN FETCH Lazy Exception because joined Entity is NullJPA/Hibernate LEFT JOIN FETCH 延迟异常,因为加入的实体为 Null
【发布时间】:2015-04-17 12:35:51
【问题描述】:

我有以下 JPA 查询:

SELECT emp FROM Employee emp LEFT JOIN FETCH emp.supervisor WHERE emp.supervisor_id = :id_number

员工数据的结构如下:

employee_ id, first_name, last_name, supervisor_id
           1,       jeff,     jones,             2
           2,        bob,     smith,             3
 etc...

其中主管 id 递归到同一张表的 id。问题是偶尔我会得到 ​​p>

 org.hibernate.LazyInitializationException: could not initialize proxy - no Session

在接下来的 EL 调用中

#{employee.supervisor.last_name} 

因为我使用的数据是只读的,会出现异常情况,例如员工的记录中有一个 supervisor_id,但这个employee_id 尚未插入系统或已从 Oracle 中过滤掉查看允许我将我的员工实体附加到。

employee_ id, first_name, last_name, supervisor_id
           4,       jane,     dean,          9999
where employee_id 9999 doesn't exist in my read-only data feed

我真正想要的是仍然获取 Employee 实体,但只是填充一个 Null 或 Empty Supervisor。

最初我在主管字段上用@NotFound(action = NotFoundAction.IGNORE) 注释了我的员工实体,但这导致实体管理器生成大量 SQL 调用,从而降低了应用程序的性能。 JPA/Hibernate Query Slow with too many queries

@Entity
Employee

@OneToOne(fetch = FetchType.LAZY)
//Removed  @NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "supervisor_id", insertable = false, updatable = false)
private Employee supervisor;

我是否在我的 Employee 实体上遗漏了一些构造函数,它将填充一个空的主管,或者对我的查询进行了一些修改,它将像注释一样执行 IGNORE,而无需大量单独的 SQL 调用?

【问题讨论】:

    标签: hibernate jakarta-ee jpa entity


    【解决方案1】:

    解决方案是使用专有注解禁用惰性关系代理:

    @org.​hibernate.​annotations.LazyToOne(LazyToOneOption.NO_PROXY)
    

    之后,lazy left join fetch 开始使用 null 代替惰性代理。

    有一个 HACK 可以对所有 *ToOne Lazy 字段禁用它:

    Enable no-proxy behaviour for all FetchType.LAZY non-collections by default in Hibernate

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 2011-10-13
      • 2019-04-28
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多