【发布时间】:2015-06-05 01:24:18
【问题描述】:
我正在使用 JPA 2.1 和 Hibernate 4.3.7
我尝试调整我的应用程序,以便将关系变得懒惰并只获取我需要的内容
我遇到了多对一关系的问题,当我再次加载实体时变成惰性时,即使我获取实体并且该代理在视图部分中不起作用,休眠也会用代理替换实体( JSF) 的应用程序。 当多对一处于渴望模式时问题消失了,但是即使我不需要它们,休眠也会为每个多对一执行一个选择
@Entity
public class Department {
@Id
private Integer id;
//...
}
1/
@Entity
public class Employee {
@Id
private Integer id;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "id_department", referencedColumnName = "id")
private Department department;
//...
}
JPQL 查询:
SELECT e FROM Employee e LEFT JOIN FETCH e.department WHERE e.id=:id
=> 一个选择查询 => 更快,但部门的类型是 Department_$$_jvst3ac_5f (employee.getDepartment().getClass().getCanonicalName()),并且此代理在应用程序的视图部分中不起作用
2/
@Entity
public class Employee {
@Id
private Integer id;
@ManyToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(name = "id_department", referencedColumnName = "id")
private Department department;
//...
}
JPQL 查询:
SELECT e FROM Employee e WHERE e.id=:id
=> 两次选择 => 较慢,但部门作为部门加载,并且在应用程序的视图部分一切正常
关系是单向的,部门没有员工的参考
使用 FETCH JOIN 时是否可以让部门没有代理?
在 Luiggi 的响应之后,我将准确地说,数据是通过惰性多对一 + fetch join 获取的。当我做一个employee.getDepartment().toString() 我有Department{ id=11, ...} 但这个部门的类仍然是Department_$$_jvst3ac_5f。由于我不知道的原因,即使获取了数据,JSF/PrimeFaces selectOneMenu 组件也无法在 HibernateProxy 中正常工作
我尝试在 @ManyToOne(fetch = FetchType.LAZY) 之外使用 Hibernate 注释 @LazyToOne(LazyToOneOption.FALSE) 但结果与单独使用 @ManyToOne(fetch = FetchType.EAGER) 相似...
【问题讨论】:
-
您好,我知道您遇到这个问题已经有一段时间了,但是您找到解决这个问题的优雅方法了吗?
标签: java hibernate jpa lazy-loading many-to-one