懶載入的產生原因:
當使用hibernate查詢乙個物件的時候,如果session關閉,在呼叫該物件關聯的集合或者物件的時候,會出現懶載入異常
解決方案(以使用者和角色為例):
方案一:
在session關閉之前,查詢物件關聯的集合或者物件,所有在業務層的方法上新增
public elecuserfinduserbylogonname(string name) ;
listlist = elecuserdao.findcollectionbyconditionnopage(condition,params, null);
//資料庫表中存在該使用者,返回elecuser物件
elecuser elecuser = null;
if(list!=null && list.size()>0)
/***
* 解決懶載入異常
除了oid之外的其他屬性 */
elecuser.getelecroles().size();
return elecuser;
}方案二:
在sevice層的方法中(sessio關閉之前),初始化物件關聯的集合或者物件
public elecuserfinduserbylogonname(string name) ;
listlist = elecuserdao.findcollectionbyconditionnopage(condition,params, null);
//資料庫表中存在該使用者,返回elecuser物件
elecuser elecuser = null;
if(list!=null && list.size()>0)
/***
* 解決懶載入異常 */
hibernate.initialize(elecuser.getelecroles());
return elecuser;
}方案三:
在elecuser.hbm.xml中,新增lazy="false",查詢使用者的同時,立即檢索查詢使用者關聯的角色集合
lazy="false">
方案四:
使用spring提供的過濾器opensessioninviewfilter,在web容器中新增該過濾器
在web.xml中新增(要求:該過濾器一定要放置到struts2的過濾器的前面,先執行該過濾器)
opensessioninviewfilter
org.springframework.orm.hibernate3.support.opensessioninviewfilter
opensessioninviewfilter
*.do
*.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter
struts2
*.do
*.jsp
hibernate的懶載入
所以想讓乙個物件為非延時載入有兩種方法 第一種就是讓該物件訪問它的乙個屬性 第二種呼叫hinbernate.initialize 物件名 懶載入時候應注意的問題 1 懶載入的物件不能是final的,因為懶載入時hinbernate會自動生成乙個繼承自源物件的 物件,如果源物件是final的就不能被繼...
hibernate 的急載入與懶載入
急載入在產生物件是就會把session資料放到快取中。懶載入是在使用該物件是才會見session資料放到快取中。急載入 test public void get 執行結果 hibernate select roleentity0 roleid as roleid1 0 0 roleentity0 r...
Hibernate懶載入策略
hibernate懶載入策略 概念 lazy的概念就是只有在真正使用物件時,才會去建立。對hibernate而言,就是真正載入時才發出載入sql語句。延遲載入機制是為了避免一些無謂的效能開銷而提出來的。重點牢記 1.load支援延遲載入,get不支援延遲載入。2.lazy的生命週期與session相...