hibernate的懶載入的四種解決方式

2021-07-11 18:16:13 字數 1482 閱讀 5795

懶載入的產生原因:

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