Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA Hibernate惰性多对一获取代理_Java_Hibernate_Jpa_Lazy Loading_Many To One - Fatal编程技术网

Java JPA Hibernate惰性多对一获取代理

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

我正在使用JPA2.1和Hibernate4.3.7

我试着调整我的应用程序,这样我就可以将关系转换为懒惰,只获取我需要的东西

@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
    方法,以便代理检索会话关闭后要使用的相关数据
是的,保持字段的急切性似乎是唯一的解决方案,不幸的是,为了避免多次选择,我在evry查询中添加了一个左连接获取部门,即使不需要部门(正如我在我的帖子中所说,使用get不是一个解决方案)@kwisatz这是一个解决方案,不能使用这种方法的事实是另一回事。那么这不是hibernate中的错误吗?如果我在它自己的事务中执行一个查询,它有一些未初始化的惰性字段,然后在一个新事务中,我进行一个不同的查询,在这种情况下,先前惰性加载的字段的相同实体现在急切地从db中获取,该字段是否应该使用新的急切获取的实体进行更新?@chrismarx basic Java:它们是在不同时间创建的不同对象,无法将它们作为同一引用进行同步。也许我有一个不同的问题,hibernate正在懒洋洋地加载特定的用户记录,然后我在另一个事务中为该用户进行查询,但是懒惰记录仍然存在,然后这就导致了问题。我知道你已经很久没有遇到这个问题了,但是你找到解决这个问题的优雅的方法了吗?