大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C++技巧 > 解释一个关于Hibernatelazy的问题

解释一个关于Hibernatelazy的问题

关键词:Hibernatelazy  阅读(518) 赞(14)

[摘要]本文是对解释一个关于Hibernatelazy的问题的讲解,对学习C++编程技术有所帮助,与大家分享。

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



相关评论