淺談解決Hibernate懶加載的4種方式
本文總結(jié)了我在學(xué)習(xí)hibernate的過程中,解決hibernate懶加載問題的四種方式。
所謂懶加載(lazy)就是延時(shí)加載,延遲加載。
什么時(shí)候用懶加載呢,我只能回答要用懶加載的時(shí)候就用懶加載。
至于為什么要用懶加載呢,就是當(dāng)我們要訪問的數(shù)據(jù)量過大時(shí),明顯用緩存不太合適,因?yàn)閮?nèi)存容量有限,為了減少并發(fā)量,減少系統(tǒng)資源的消耗,我們讓數(shù)據(jù)在需要的時(shí)候才進(jìn)行加載,這時(shí)我們就用到了懶加載。
例如,有一個(gè)對象是Employee,還有一個(gè)對象是Department。顯然,對于Employee相對Department來說,是多對一的關(guān)系;而對于Department相對Employee來說,是一對多的關(guān)系。當(dāng)我們查詢Employee對象的時(shí)候,如果希望通過employee對象的屬性department查詢到所對應(yīng)的Department,那么是會(huì)拋出異常的。這是因?yàn)閼屑虞d的存在,在session關(guān)閉之后,hibernate又向數(shù)據(jù)庫發(fā)出一次請求,結(jié)果就拋出異常了。
下面總結(jié)的是解決這個(gè)問題的四種方式:
1.顯式初始化(在查詢方法內(nèi)部)
要查詢某員工屬于哪個(gè)部門的時(shí)候,需要對Department進(jìn)行預(yù)先查詢
使用語句
Hibernate.initialize(Department.class);

2.修改對象關(guān)系文件,將lazy改寫lazy=false,即關(guān)閉懶加載
以上兩種方法,確實(shí)可以解決問題,但是缺點(diǎn)是無論后面是否使用該對象,hibernate都會(huì)向數(shù)據(jù)庫發(fā)出SQL語句請求數(shù)據(jù),造成不必要的性能浪費(fèi)。
3.使用過濾器(web項(xiàng)目)
①獲取session的方式必須使用getCurrentSession
②特殊的關(guān)閉session方式
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getCurrentSession();
tx = session.beginTransaction();
arg2.doFilter(request, response);//請求一直在走
tx.commit();
} catch (Exception e) {
// TODO: handle exception
if(tx != null){
tx.rollback();
}
}finally{
//特殊的關(guān)閉方式
HibernateUtil.closeCurrentSession();
}
}
4.在SSH框架中,使用spring提供的openSessionView
其原理和第三種方法中使用Filter類似,只不過這個(gè)filter是spring提供的。使用時(shí)只需要在web.xml文件配置如下:
<!-- 使用spring解決懶加載問題 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第3和第4中方法也能解決懶加載的問題,其中第4種方法也是目前使用較多的。但是這兩種方法也是有缺點(diǎn)的,缺點(diǎn)就是延長了session關(guān)閉的時(shí)間,session的生命周期變長。沒有使用該方法之前,session是在查詢完數(shù)據(jù)之后,就被關(guān)閉了;而現(xiàn)在,session的關(guān)閉是在一次web請求的最后才關(guān)閉。
總結(jié)
以上就是本文關(guān)于淺談解決Hibernate懶加載的4種方式的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
基于maven的springboot的"過時(shí)"用法解析
這篇文章主要為大家介紹了基于maven的springboot"過時(shí)"用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
spring cloud gateway中redis一直打印重連日志問題及解決
這篇文章主要介紹了spring cloud gateway中redis一直打印重連日志問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
spring?java?動(dòng)態(tài)獲取consul?K/V的方法
這篇文章主要介紹了spring?java?動(dòng)態(tài)獲取consul?K/V的相關(guān)資料,主要包括springConsul配置kv路徑以及自動(dòng)注入consulKV到服務(wù)中,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Spring Boot 自動(dòng)配置的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot 自動(dòng)配置的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法
這篇文章主要介紹了SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案,通過實(shí)例代碼介紹了SpringBoot各個(gè)層次的操作,需要的朋友可以參考下2022-04-04
JAVA HTTP反向代理實(shí)現(xiàn)過程詳解
這篇文章主要介紹了JAVA HTTP反向代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
基于idea把maven工程轉(zhuǎn)換為web項(xiàng)目
這篇文章主要介紹了基于idea把maven工程轉(zhuǎn)換為web項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

