Java JPA Hibernate惰性多对一获取代理
我正在使用JPA2.1和Hibernate4.3.7 我试着调整我的应用程序,这样我就可以将关系转换为懒惰,只获取我需要的东西Java JPA Hibernate惰性多对一获取代理,java,hibernate,jpa,lazy-loading,many-to-one,Java,Hibernate,Jpa,Lazy Loading,Many To One,我正在使用JPA2.1和Hibernate4.3.7 我试着调整我的应用程序,这样我就可以将关系转换为懒惰,只获取我需要的东西 @Entity public class Department { @Id private Integer id; //... } 我对多对一关系有一个问题,当我再次加载实体时变为懒惰时,Hibernate用代理替换实体,即使我获取实体并且该代理在应用程序的视图部分(JSF)中不起作用。 当多对一模式处于急切模式时,问题就迎刃而解了,但是hi
@Entity
public class Department {
@Id
private Integer id;
//...
}
我对多对一关系有一个问题,当我再次加载实体时变为懒惰时,Hibernate用代理替换实体,即使我获取实体并且该代理在应用程序的视图部分(JSF)中不起作用。
当多对一模式处于急切模式时,问题就迎刃而解了,但是hibernate为每个多对一执行一选择,即使我不需要它们
@Entity
public class Department {
@Id
private Integer id;
//...
}
一,/
JPQL查询:
SELECT e FROM Employee e LEFT JOIN FETCH e.department WHERE e.id=:id
SELECT e FROM Employee e WHERE e.id=:id
=>一个select查询=>速度更快,但department的类型为department\u$\ uJVST3AC\u5F(employee.getDepartment().getClass().getCanonicalName()),此代理在应用程序的视图部分不起作用
二,/
JPQL查询:
SELECT e FROM Employee e LEFT JOIN FETCH e.department WHERE e.id=:id
SELECT e FROM Employee e WHERE e.id=:id
=>two select=>速度较慢,但department作为department加载,并且在应用程序的视图部分一切正常
关系是单向的,部门没有员工的参考资料
在使用FETCH JOIN时,部门是否可以不使用代理
在Luiggi的响应之后,我将确定数据是通过惰性多对一+获取连接获取的。当我处理employee.getDepartment().toString()时,我有Department{id=11,…},但是这个Department的类仍然是Department\uu$$\ ujvst3ac\u5f。由于我不知道的原因,JSF/PrimeFaces selectOneMenu组件在HibernateProxy下无法正常工作,即使数据被获取
我试图在@ManyToOne(fetch=FetchType.LAZY)之外使用Hibernate注释@LazyToOne(LazyToOneOption.FALSE),但结果与@ManyToOne(fetch=FetchType.EAGER)类似……问题是,当使用延迟加载时,您将获得类的代理(如您所述)只有当hibernatesession仍处于打开状态时,此代理才能从数据库中获取数据。在将数据返回到视图时,您的会话似乎正在关闭,因此当尝试在视图中使用延迟加载的字段时,您会遇到异常 可能的解决办法:
- 保持字段为fetch-eager,并为针对实体的每个查询支付开销(这可能不好,可能会影响性能,但这是一个解决方案)
- 在Hibernate会话关闭之前,将字段保持为lazy,并使用适当的
方法,以便代理检索会话关闭后要使用的相关数据李>get