你可以把所有的关联对象的lazy设置为false,然后通过Hibernate.initialize()方法强制加载某集合,使他们在session关闭后仍然可以使用
比如User关联一个集合Set addresses,设置关联lazy为false,为了使addresses在session关闭后仍然可以使用,我们在查询的时候使用:
Hibernate.initialize(user.getAddresses()); //强制实例化
以后在session关闭后,调用user.getAddresses()得到关联集合,将不会抛出异常
不知道我解释的是否足够清楚,如果LZ还不清楚,建议看看hibernate的文档
比如User关联一个集合Set addresses,设置关联lazy为false,为了使addresses在session关闭后仍然可以使用,我们在查询的时候使用:
Hibernate.initialize(user.getAddresses()); //强制实例化
以后在session关闭后,调用user.getAddresses()得到关联集合,将不会抛出异常
不知道我解释的是否足够清楚,如果LZ还不清楚,建议看看hibernate的文档
我查询一个Addresses的时候 ,不需要查询User,而有的时候又需要,我设置了Lazy为false;我用Session.find("from addresses as c")查询出来的时候,是一个List;你说的那个Hibernate.initialize()是加载单个对象的.而我查询出来的都是List,该怎么样才能在Session关闭后才能使用关联对象?
无非就是循环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();
}
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,配合使用非常好
总是报告"The own session is closed"也就是说,都要去循环List里面的每个类,分别去初始化?
没直接的方法让lazy为false的,在代码里变为立即检索.
这里有有牛人robbin关于这方面的文章.http://forum.javaeye.com/viewtopic.php?t=15057
OpenSessionInView的原理是什么呢?
按道理说数据连接执行完后应该马上关闭应该是不推荐使用这个吧?
如果页面数据很大,或者做循环去了,那就一直占用着连接~!谢谢killme2008(为了生态平衡,请保护蛤蟆) 的帮助和回复.
我个人认为并没有太大影响
这是一篇很精彩的帖子,你看看