手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

解释一个关于Hibernate lazy的问题

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

使用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">




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS