我发现了我的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()
我的代码工作正常。
知道发生了什么事吗?感谢。
答案 0 :(得分:5)
您的@OneToMany
关联可能与fetchType="lazy"
(可能默认情况下)相关联。这意味着在加载实体AnotherClassSet
时,未加载关联(在您的情况下为SomeClass
}。只有在您尝试使用getAnotherClassSet()
访问它时才会加载它。
但是,在您的示例中,会话结束后,getAnotherClassSet()
语句会调用此方法(return
)。
要解决此问题,您可以在关闭会话之前尝试调用getAnotherClassSet()
,只是为了加载AnotherClassSet
关联。
答案 1 :(得分:1)
因为您正在使用lazy initialization
(默认设置)。在lazy initialization
中,每个集合字段仅在请求时提取。您必须将初始化指定为eager
,才能使代码正常工作。 Eager initialization
在一次获取中获取整个对象。