解释一个关于Hibernate lazy的问题
2008-02-23 05:40:16来源:互联网 阅读 ()
使用Hibernate时意外报错:
Exception in thread "main" 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)
at com.entry.database.bean.OaLoginLink$EnhancerByCGLIB$a418b18d.getName(<generated>)
at test.Test.main(Test.Java:145)
很是让我头痛,上网查看相关资料发现这样一个解决方式:
"org.hibernate.LazyInitializationException: could not initialize proxy"延迟抓取出的错,hb3对many-to-one的默认处理是lazy = "proxy",没有搞懂到底怎么回事,把任何many-to-one,one-to-one都加上lazy="false"...
这个方法理论上没错,但是会让人产生误解,使人以为只是修改<set>中的lazy值,照做后程式依然会报错,看看下面的文章也许就明白了(注意最后一行红色标记)!
lazy initialization
集合(不包括数组)是能够延迟初始化的,意思是仅仅当应用程式需要访问时,才载入他们的值。
s = sessions.opensession();
User u = (User) s.find("from User u where u.name=?", userName,
Hibernate.STRING).get(0);
Map permissions = u.getPermissions();
s.connection().commit();
s.close();
Integer ACCESSLevel = (Integer) permissions.get("accounts"); //Error!
因为在commit之前,permissions没有被用到,permission没有被初始化,而session被close了,导致permissions永远都无法load data.
解决办法:吧最后一行一道session被提交之前.
配置:
<set name="names" table="NAMES" lazy="true" order-by="name asc">
<key column="group_id"/>
<element column="NAME" type="string"/>
</set>
==================================
在做Spring1.2 Hibernate 3 struts demo时候碰到一个问题,编辑用户数据时候
用com.jeedev.service.dao.hibernate.UserHibernateDao 中 public TSysuser getUser(int userid) { } 方法,总是不能正常显示编辑数据。具体表现为:
参考 com.jeedev.service.dao.hibernate.UserHibernateDao 第32-45行
Java代码:
public TSysuser getUser(int userid) {
if (this.getHibernateTemplate() == null) {
System.out.println("error at there");
return null;
}
TSysuser edituser= (TSysuser) getHibernateTemplate().load(TSysuser.class, new Integer(userid));
System.out.println(edituser.getUsername());
System.out.println(edituser.getDeptno());
return edituser;
}
假如删除上面的
Java代码:
System.out.println(edituser.getUsername());
System.out.println(edituser.getDeptno());
在点击编号,修改时候就会出现错误:
2005-10-27 15:35:59,245 ERROR [org.hibernate.LazyInitializationException] - could not initialize proxy - the owning session was closed
org.hibernate.LazyInitializationException: could not initialize proxy - the owning session was closed
经过在Javaeye论坛大家一致认为 是hibernate lazy的原因
在WEB级别应用时候,会出现意想不到的lazy错误,解决方法就是 配置 lazy="false" 例:
<hibernate-mapping>
<class name="com.jeedev.hb.TSysuser" table="t_sysuser" lazy="false">
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 专家详解:复杂表达式的执行步骤
下一篇: Java版本和C 版本简单Stack程式
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash