使用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">
新聞熱點
疑難解答