Hibernate - 懒得初始化 - 没有关闭会话或会话

时间:2013-08-07 11:30:30

标签: hibernate jsf lazy-loading

我发现了我的hibernate程序的奇怪状况。这是我的代码

public Set<AnotherClass> getAnotherClassSetsFromSomeClass() {
        Session session = HIbernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        SomeClass sc = (SomeClass)session.get(SomeClass.class,"classId");
        trans.commit();
        session.close;
        return sc.getAnotherClassSet();
    }

如果我在Java控制台上运行它,这段代码看起来很好。

如果我使用它一个网络应用程序(JSF),我收到此错误

未能懒惰地初始化 - 没有关闭会话或会话

它有一对多的关系(一个SomeClass有很多AnotherClass)

异常消息指向返回sc.getAnotherClassSet()作为空指针。我确信我的数据库中有这些数据。

我发现如果我添加System.out.println(sc.getAnotherClassSet()) ber return sc.getAnotherClassSet()我的代码工作正常。

知道发生了什么事吗?感谢。

2 个答案:

答案 0 :(得分:5)

您的@OneToMany关联可能与fetchType="lazy"(可能默认情况下)相关联。这意味着在加载实体AnotherClassSet时,未加载关联(在您的情况下为SomeClass}。只有在您尝试使用getAnotherClassSet()访问它时才会加载它。

但是,在您的示例中,会话结束后,getAnotherClassSet()语句会调用此方法(return)。

要解决此问题,您可以在关闭会话之前尝试调用getAnotherClassSet(),只是为了加载AnotherClassSet关联。

答案 1 :(得分:1)

因为您正在使用lazy initialization(默认设置)。在lazy initialization中,每个集合字段仅在请求时提取。您必须将初始化指定为eager,才能使代码正常工作。 Eager initialization在一次获取中获取整个对象。