你可以把所有的关联对象的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的文档
解决方案 »
- 求精通j2ee--eclipse、struts、hibernate及spring整合应用案例 随书光盘
- 用Spring+Hibernate. SpringDAO如何修改数据库?
- Struts的 formBean的 reSet()方法是来做什么的?
- 如何获取xml信息???
- soap 和webservice是什么关系呢?如何编译一组wsdl文件呢??
- 请大家帮我看看我的session bean,我已经折腾好几天了~~。
- 大家帮我看看这这个提示,错误出在哪里?
- 文件相对目录的麻烦?
- hibernate.cfg.xml文件配置问题
- 巨菜问题:java文件在编译成class文件后用java.exe解释执行的时候遇到问题,请帮忙解决?在线等待!!!
- jsp问题
- 一个spring问题
我查询一个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(为了生态平衡,请保护蛤蟆) 的帮助和回复.
我个人认为并没有太大影响
这是一篇很精彩的帖子,你看看