3

我发现我的休眠程序的情况很奇怪。这是我的代码

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 控制台上运行此代码,它看起来不错。

如果我在一个 Web 应用程序 (JSF) 中使用它,我会收到此错误

懒惰初始化失败 - 没有会话或会话被关闭

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

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

好吧,我发现如果我添加System.out.println(sc.getAnotherClassSet())berforereturn sc.getAnotherClassSet()我的代码工作正常。

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

4

2 回答 2

5

可能,您的@OneToMany关联已映射fetchType="lazy"(可能是默认情况下)。这意味着在您的情况下AnotherClassSet,关联在您加载实体时未加载SomeClass。它仅在您尝试访问它时加载,使用getAnotherClassSet().

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

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

于 2013-08-07T11:59:13.080 回答
1

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

于 2013-08-07T11:43:41.977 回答