我有以下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调用?
答案 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