Hibernate-延迟初始化失败-未关闭任何会话或会话
我发现我的hibernate程序状态很奇怪。这是我的密码Hibernate-延迟初始化失败-未关闭任何会话或会话,hibernate,jsf,lazy-loading,Hibernate,Jsf,Lazy Loading,我发现我的hibernate程序状态很奇怪。这是我的密码 public Set<AnotherClass> getAnotherClassSetsFromSomeClass() { Session session = HIbernateUtil.getSessionFactory().openSession(); Transaction trans = session.beginTransaction(); SomeClass sc =
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();
}
public Set getanotherclasssetsfromesomeclass(){
Session Session=HIbernateUtil.getSessionFactory().openSession();
Transaction=session.beginTransaction();
SomeClass sc=(SomeClass)session.get(SomeClass.class,“classId”);
trans.commit();
会议结束;
返回sc.getAnotherClassSet();
}
如果我在Java控制台上运行,这段代码看起来不错
如果我在一个web应用程序(JSF)中使用它,我会得到这个错误
延迟初始化失败-没有会话或会话已关闭
它有一对多的关系(一个某类有多个另一类)
异常消息指向返回sc.getAnotherClassSet()
作为空指针。我确信我的数据库中有这些数据
我发现如果我添加System.out.println(sc.getAnotherClassSet())
berforereturn sc.getAnotherClassSet()
我的代码运行良好
知道发生了什么吗?谢谢。因为您正在使用
延迟初始化
(这是默认设置)。在延迟初始化中
,每个收集字段仅在请求时获取。您必须将初始化指定为eager
,代码才能工作<代码>即时初始化在一次获取中获取整个对象 很可能,您的@OneToMany
关联映射为fetchType=“lazy”
(默认情况下)。这意味着在您加载实体SomeClass
时,不会加载另一个类集中的关联。只有当您尝试使用getAnotherClassSet()
访问它时,才会加载它
但是,在您的示例中,此方法(getAnotherClassSet()
)在会话关闭后在return
station上调用
要解决此问题,您可以尝试在关闭会话之前调用getAnotherClassSet()
,只是加载AnotherClassSet
关联。您能否解释为什么在返回之前添加System.out.println(),我的代码正在工作?在关闭会话之后,即session.close()
,您无法获取任何内容。这是答案,但要调用getter或setter,最好将class属性与一些函数一起使用,比如getAnotherClassSet().size(),它将加载到某个类中的另一个类集中。谢谢,加载另一个类集
关联(属于某个类
)是我在回答的最后一段中试图建议的;-)