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 =

我发现我的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();
    }
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())
berfore
return sc.getAnotherClassSet()
我的代码运行良好


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

因为您正在使用
延迟初始化
(这是默认设置)。在
延迟初始化中
,每个收集字段仅在请求时获取。您必须将初始化指定为
eager
,代码才能工作<代码>即时初始化在一次获取中获取整个对象

很可能,您的
@OneToMany
关联映射为
fetchType=“lazy”
(默认情况下)。这意味着在您加载实体
SomeClass
时,不会加载另一个类集
中的关联。只有当您尝试使用
getAnotherClassSet()
访问它时,才会加载它

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


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

您能否解释为什么在返回之前添加System.out.println(),我的代码正在工作?在关闭会话之后,即
session.close()
,您无法获取任何内容。这是答案,但要调用getter或setter,最好将class属性与一些函数一起使用,比如getAnotherClassSet().size(),它将加载到某个类中的另一个类集中。谢谢,加载
另一个类集
关联(属于
某个类
)是我在回答的最后一段中试图建议的;-)