开始时候报错
sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed
后来在<many-to-one>里设置lazy="false". 但有可能会引发另一个异常叫
failed to lazily initialize a collection of role: XXXXXXXX, no session or session was closed
不过不是每次查询都会报错,大概30~40次查询会报错一次,在测试服务器上问题很不容易重现,在生产环境看log很容易发现问题。
我们的框架是struts1.2+hibernate3.1,没有使用spring,请问应该如何解决这个问题,谢谢。

解决方案 »

  1.   

    LZ看下吧,写的很全的,还有解决方案
    http://linweihan.javaeye.com/blog/145323
      

  2.   

    我也用的Struts+hibernate,没有出现这样的问题。应该是你代码有问题。
      

  3.   

    很好理解啊。
    延迟加载就是用到的时候再加载,当你用到的时候也许你的session已经关闭了。
    class Teacher
    {
        List studentList ;
    }
    这是一个一对多的关系。query()
    {
    Session session ...;
    Teacher t = session.query();
    session.close();   //到这步,t的studentList值还没加载,但是session关闭了
    t.getStudentList(); // 加载,但session已经关闭
    }
    你的代码中应该有这样的地方。我觉得你说的3,40次就报一次错误,不是同一个地方。
    一行代码要么可以执行,要么不可以执行,怎么会像六脉神剑一样,时灵时不灵呢?
      

  4.   

    很正常。你用的是延迟加载的。
    如果你不在jsp调用延迟加载的数据,不会抛错的。如果在jsp中调用其中的一个延迟,但这个时候你的session已经被关闭了(应该是在 hibernate层就被关闭了)。所以
    在jsp中肯定无法得到数据啦。抛出sessionClose异常。spring解决这个问题的方法是在filter层开启和关闭session。如果你不想改太多代码,只能把跑错的那个延迟加载取消了。