解释一个关于Hibernate lazy的问题

问题

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

时间: 2024-12-24 08:30:48

解释一个关于Hibernate lazy的问题的相关文章

一个关于Hibernate lazy的问题

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

200分,请大家解释一个关于hibernate的问题

问题描述 各位大哥,小生问大家一个问题,我做hibernate多对多的时候,那个中间表里的数据,为什么不能重复呀?听别人说是联合主健,但是,我没有配置联合主健呀 解决方案 解决方案二:如果回答正确加100分解决方案三:楼主还要多点描述吧...解决方案四:hibernate多对多中间表,一般都是两个外键,例如用户表(user),主键:userid.角色表(role),主键:roleid.中间表字段为两个外键:userid,roleid作为联合主键解决方案五:应该可以重复啊,因为它们是属于两个表,两

解释spring,struts,hibernate优缺点

解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录.文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复

用 OpenSessionInViewInterceptor 的思路解决 Spring框架中的Hibernate Lazy

众所周知, 为了解决 Hibernate Lazy 问题, Spring 中引入了 OpenSessionInViewInterceptor, 这样虽然解决了页面上的 Lazy Load 问题,却增加了各层之间的偶合性, 如果一个 Lazy 的 Collection 在页面上可以被正确的 load, 但是如果请求不是来自于 HttpServletRequest (比如在 TestCase 或 Service 中希望获取 lazy 的属性), 一般会导致两种错误: 代码 1. 设置了 lazy =

急求一个Spring+Hibernate对MySQL数据库进行增删改查的例子!!!!

问题描述 现急求一个Spring+Hibernate对MySQL数据库进行增删改查的例子,例子比较简单也可以,主要就是要对数据库进行增删改查操作.如果哪位有的话请发到邮箱(395897780@qq.com),或者告诉我网址也行!最好是能连工程一起打包下载的,能够运行的,由于刚刚开始学,想下个完整的下来,怎样便于分析!!!本人在这里先表示感谢!!!!! 解决方案 解决方案二:其实不用这样,你用工具做,其中的包就可以生成的,注意:Hibernate一定要托管给Spring:之后以前Hibernate

标签-问一个关于hibernate的问题?

问题描述 问一个关于hibernate的问题? 多对一关系,DataDic对DataDicType, 然后通过查询获得DataDic的表数据,放在dataDicList数组中,怎么在jstl的c:foreach标签中显示DataDicType中的某个字段值,即dataDic.dataDicType.getXXX() 这是DataDic的表和映射文件 这是DataDicType表,和DataDic有一对多 多对一关系 这是页面要显示的列表内容,问题就在这里,第2列的ddTypeName怎么获取?

hibernate lazy——延迟加载

 hibernate lazy策略可以使用在: * <class>标签上,可以取值:true/false ,在hibernate3以上版本,默认是true * <property>标签上,可以取值:true/false 需要类增强工具 * <set><list>标签上,可以取值:true/false/extra * <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/no-proxy laz

从头到脚跟你解释什么是Hibernate

Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中).它解放了您,使您可以专注于应用程序的对象和功能,而不必担心如何保存它们或稍后如何找到它们. 大多数应用程序都需要处理数据.Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法.有时候,甚至在编写应用程序之前,数据

用MyEclipse创建一个Struts+Hibernate项目

第一步: 创建一个Web Project, 在主窗口菜单里面点击 File -> New -> Project..., 会弹出New Project的窗口, 选择MyEclipse -> J2EE Projects -> Web Project, 然后Next, 填写你的Project Name, Source Folder, Web root folder以及Context root URL, Location是指你的工作目录, 你可以选择默认的, 也可以指向自己想要的路径, F