JPA / Hibernate LEFT JOIN FETCH Lazy Exception因为连接的Entity是Null

时间:2015-02-16 21:49:16

标签: hibernate java-ee jpa entity

我有以下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...

其中supervisor id递归到同一个表的id。问题是偶尔我会得到

 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

我真正想要的仍然是抓住员工实体,但只填充空或空主管。

最初我在管理员字段上用@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实体上缺少一些构造函数,它将填充一个空的Supervisor,或者我的查询是否会对注释执行IGNORE进行一些修改,而没有大量的单独SQL调用?

1 个答案:

答案 0 :(得分:0)

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

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

之后,懒惰的左连接提取开始使用null,不会发生连接而不是延迟代理。

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

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