论坛首页 Java企业应用论坛

用Lazy Initialization时提示no Session一般是什么问题?

浏览 7524 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-09-28  
提示如下:

服务器: Failed to lazily initialize a collection - no Session
net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection - no Session
   发表时间:2003-09-28  
出现这个问题是这样的:
1, 你用了某个lazyload;
2,在你用之前,session已经关闭了。

比如:Forum.topics是lazyLoad的,但是你做了如下的操作:
session = .. // session get;
Forum forum  = session.createCriteria(Forum.class);
       .addCriteria(Expression.eq("forumId",new Long(12);););
       .uniqueResult();;
session.close();;
forum.topics[15]....


并且在hbm文件中你制定forum.topics是一个指向Topic的1:n连接,并且是lazy load.
那么当你试图使用forum.topics[15]的时候,系统会自动从数据库把topic[15]load进来。但由于此时数据库连接已经中止,所以就会抛出
Failed to lazily initialize a collection - no Session

解决办法:
强制进行EAGER_FETCH

session = .. // session get;
Forum forum  = session.createCriteria(Forum.class);
       .addCriteria(Expression.eq("forumId",new Long(12);););
       .setFetchMode("topics", FetchMode.EAGER); 
       .uniqueResult();;
session.close();;
forum.topics[15]....


这样就OK了。
如果你用HQL的,也有相应的FETCH mode可以用的吧。
0 请登录后投票
   发表时间:2003-09-28  
谢谢,问题应该就是你说的那样。我把lazy设为false会不会有很大影响呢,性能上?
0 请登录后投票
   发表时间:2003-09-28  
要你自己掌握阿,hbm里面指定的是一个默认值,反正你可以在query的时候自己掌握到底是否lazy load.所以主动权在你。
0 请登录后投票
   发表时间:2003-09-28  
Criteria.setFetchMode("association",FetchMode.EAGER)其实采用的是left join,这样返回的List的长度并不是你所查询的那个Class的记录数,而是你所查询的那个Class的记录数乘上每一个FetchMode为FetchMode.EAGER的association中的纪录数,这样没法分页了

而在mapping文件中设置lazy="false",且不在hql中指定left join fetch,
查询时(用Query.list()或Session.find())是分两步的:先查询出主类,再查询association。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics