你可以把所有的关联对象的lazy设置为false,然后通过Hibernate.initialize()方法强制加载某集合,使他们在session关闭后仍然可以使用
比如User关联一个集合Set addresses,设置关联lazy为false,为了使addresses在session关闭后仍然可以使用,我们在查询的时候使用:
Hibernate.initialize(user.getAddresses());  //强制实例化
以后在session关闭后,调用user.getAddresses()得到关联集合,将不会抛出异常
不知道我解释的是否足够清楚,如果LZ还不清楚,建议看看hibernate的文档

解决方案 »

  1.   

    killme2008(为了生态平衡,请保护蛤蟆)你说的那个方法我是知道的
    我查询一个Addresses的时候 ,不需要查询User,而有的时候又需要,我设置了Lazy为false;我用Session.find("from addresses as c")查询出来的时候,是一个List;你说的那个Hibernate.initialize()是加载单个对象的.而我查询出来的都是List,该怎么样才能在Session关闭后才能使用关联对象?
      

  2.   

    我看到有的代码是这样写的
    无非就是循环List内每一个对象,然后再去读取一下关联对象,
    这样虽然说是可行的,但是那个循环是无意义的
    有没有别的方法可行的?List list=Session.find("from addresses as c");
     for(int i = 0; i < list.size(); i++)
    {
    Addresses ad=(Addresses)list.get(i);
    ad.getUser().getName();
    }
      

  3.   

    我的意思是:
    List list=Session.find("from addresses as c");
    Iterator it=list.iterator();
    while(it.hasNext){
      address=(Address)it.next();
       Hibernate.initialize(address.getUsers());
    }
    如此迭代,强制实例化关联的集合,Hibernate.initialize()不只加载单个对象,也可以强制加载集合类型的
    实在不行就使用OpenSessionInView模式吧,把session传到view再关闭,如果有用到spring,配合使用非常好
      

  4.   

    killme2008(为了生态平衡,请保护蛤蟆) 我的就是在Spring下使用的.我在Struts那端访问关联对象的时候.
    总是报告"The own session is closed"也就是说,都要去循环List里面的每个类,分别去初始化?
    没直接的方法让lazy为false的,在代码里变为立即检索.
      

  5.   

    你了解下OpenSessionInView模式吧,这方面的资料很多,或者查看spring自带的文档
      

  6.   

    OpenSessionInView就是 在view层还能OpenSession?我看了一下
    这里有有牛人robbin关于这方面的文章.http://forum.javaeye.com/viewtopic.php?t=15057
    OpenSessionInView的原理是什么呢?
      

  7.   

    顾名思义,原理就是打开一个session一直保留到你页面显示完你数据之后再关闭session,本质上也就是通过一个filter拦截器来实现
      

  8.   

    这样对性能会不会有影响?
    按道理说数据连接执行完后应该马上关闭应该是不推荐使用这个吧?
    如果页面数据很大,或者做循环去了,那就一直占用着连接~!谢谢killme2008(为了生态平衡,请保护蛤蟆) 的帮助和回复.
      

  9.   

    这个跟网络连接有关的,具体性能讨论请你去javaeye论坛看看
    我个人认为并没有太大影响
      

  10.   

    http://forum.javaeye.com/viewtopic.php?t=17501
    这是一篇很精彩的帖子,你看看