Hibernate延迟加载的怪问题

llnotice 2008-12-05 03:39:49
写了一个映射文件,里面有一个一对多的集合。

在service调用dao方法如下:
try {
Vendor vendor=vendorDao.get(HibernateSessionFactory.currentSession(), id);
//Hibernate.initialize(vendor);
return vendor;
} catch (Exception e) {
// TODO: handle exception
throw new ServiceException("自定义异常 " + e);
} finally {
HibernateSessionFactory.closeSession();
}


然后写了一个测试方法调用service类中此方法。
系统抛出了异常:
[eMarket] ERROR 2008-12-05 15:25:44,203 could not initialize proxy - the owning Session was closed | org.hibernate.LazyInitializationException.<init>(19)
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134)



问题就是,我在测试方法中只是print了这个类中的基本信息,并没有访问关联类的信息,但是仍然抛出了session关闭的异常。
而且我将hbm中一对多映射注释后,仍然会抛出异常。
调用Hibernate.initialize(vendor);强制初始化后,程序正常执行。
hbm class级别显示设置laze="false"后,程序也能正常执行。但是类级别(非关联类)的lazy默认不就是false的吗。


...全文
112 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
llnotice 2008-12-08
  • 打赏
  • 举报
回复
找到原因了
是因为在dao层中用的是load来访问数据库,所有返回的是一个代理类的对象,并没有真正初始化。
改成get就可以了
llnotice 2008-12-08
  • 打赏
  • 举报
回复
我并没有去访问集合类中的东西,现在仅仅是在输出vendor类的信息
也就是说我把set的映射去掉后,仍然说了代理的session已经关闭。
hibernate在类级别绝对是默认立即加载的,lazy=false
只有在一对多映射的时候才需要设置lazy=true
lihan6415151528 2008-12-07
  • 打赏
  • 举报
回复
设置lazy=false即可
如果默认是false的话,那么我们使用延迟加载时候怎么会写false呢
llnotice 2008-12-07
  • 打赏
  • 举报
回复
类级别的lazy不是默认就是false吗,是立即加载的。
我记得关联级别的lazy默认是true,默认延迟加载。
無名VF 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zou_wei_forever 的回复:]
你在set标签中设置lazy="false"就可以解决了,不过这样的话,性能会有损失!
[/Quote]
...
markspain 2008-12-06
  • 打赏
  • 举报
回复
默认是lazy="true"
zou_wei_forever 2008-12-05
  • 打赏
  • 举报
回复
你在set标签中设置lazy="false"就可以解决了,不过这样的话,性能会有损失!
qq278095755 2008-12-05
  • 打赏
  • 举报
回复
是提前关闭session了.
楼主可以用sping的 open session in view
或者,自己用threadlocal 写一个过滤器来关闭session
zealVampire 2008-12-05
  • 打赏
  • 举报
回复
open session in view, lazy loading的导致的

http://blog.csdn.net/zealVampire/archive/2007/06/06/1640999.aspx

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧