1. 程式人生 > >淺談解決Hibernate懶載入的4種方式

淺談解決Hibernate懶載入的4種方式

這篇文章是我在學習hibernate的懶載入時整理的資料,主要介紹瞭解決Hibernate懶載入的4種方式,具有一定借鑑價值,需要的朋友可以參考下。 

本文總結了我在學習hibernate的過程中,解決hibernate懶載入問題的四種方式。

所謂懶載入(lazy)就是延時載入,延遲載入。

什麼時候用懶載入呢,我只能回答要用懶載入的時候就用懶載入。

至於為什麼要用懶載入呢,就是當我們要訪問的資料量過大時,明顯用快取不太合適,因為記憶體容量有限,為了減少併發量,減少系統資源的消耗,我們讓資料在需要的時候才進行載入,這時我們就用到了懶載入。

例如,有一個物件是Employee,還有一個物件是Department。顯然,對於Employee相對Department來說,是多對一的關係;而對於Department相對Employee來說,是一對多的關係。當我們查詢Employee物件的時候,如果希望通過employee物件的屬性department查詢到所對應的Department,那麼是會丟擲異常的。這是因為懶載入的存在,在session關閉之後,hibernate又向資料庫發出一次請求,結果就丟擲異常了。

下面總結的是解決這個問題的四種方式:

1.顯式初始化(在查詢方法內部)

要查詢某員工屬於哪個部門的時候,需要對Department進行預先查詢

使用語句

Hibernate.initialize(Department.class); 

2.修改物件關係檔案,將lazy改寫lazy=false,即關閉懶載入

以上兩種方法,確實可以解決問題,但是缺點是無論後面是否使用該物件,hibernate都會向資料庫發出SQL語句請求資料,造成不必要的效能浪費。

3.使用過濾器(web專案)

①獲取session的方式必須使用getCurrentSession

②特殊的關閉session方式

public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException {
    Session session = null;
    Transaction tx = null;
    try {
        session = HibernateUtil.getCurrentSession();
        tx = session.beginTransaction();
        arg2.doFilter(request, response);
        //請求一直在走
        tx.commit();
        } catch (Exception e) {
            if(tx != null){
                tx.rollback();
            }
        }finally{
                    //特殊的關閉方式
                HibernateUtil.closeCurrentSession();
        }
        
    }

4.在SSH框架中,使用spring提供的openSessionView

其原理和第三種方法中使用Filter類似,只不過這個filter是spring提供的。使用時只需要在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種方法也是目前使用較多的。但是這兩種方法也是有缺點的,缺點就是延長了session關閉的時間,session的生命週期變長。沒有使用該方法之前,session是在查詢完資料之後,就被關閉了;而現在,session的關閉是在一次web請求的最後才關閉。

個人總結

使用懶載入後,要想得到一個物件的關聯物件,會報一個錯誤:could not initialize proxy - no Session

因為DAO層對資料庫操作後,就關閉了session。

相關推薦

解決Hibernate載入4方式

這篇文章是我在學習hibernate的懶載入時整理的資料,主要介紹瞭解決Hibernate懶載入的4種方式,具有一定借鑑價值,需要的朋友可以參考下。  本文總結了我在學習hibernate的過程中,解決hibernate懶載入問題的四種方式。 所謂懶載入(lazy)就

解決Hibernate載入4方式

本文總結了我在學習hibernate的過程中,解決hibernate懶載入問題的四種方式。 懶載入簡述:當我們查詢一個物件的時候,在預設情況下,返回的只是該物件的代理物件,當用戶去使用該物件的屬性時,才會向資料庫再一次發出查詢語句。 例如,有一個物件是Employee,還有

解決hibernate載入問題No session的問題

<!-- 解決懶載入問題 --> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframewo

解決hibernate載入異常

事務的處理都是在service層進行解決 hibernate預設是進行懶載入   那麼其實在service處理完事務後  session就會進行關閉  而當我們在頁面再去呼叫 本物件中的子物件的相關屬性的時候 因為session已經關閉了  所以就會存在懶載入異常 即ses

spring事務管理的2方式:程式設計式事務管理和宣告式事務管理;以及@Transactional(rollbackFor=Exception.class)註解用法

事務的概念,以及特性: 百度百科介紹: ->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過

vue webpack 載入方式

const router = new Router({     routes: [          {                path:

vue+element ui專案總結點(一)select、Cascader級聯選擇器、encodeURI、decodeURI轉碼解碼、一級mockjs用法、路由載入方式

不多說上程式碼: <template> <div class="hello"> <h1>{{ msg }}</h1> <p>Element UI簡單Cascader級聯選擇器使用</p> <

# 新人hibernate載入的理解

新人淺談對hibernate的懶載入的理解 懶載入是hibernate中常見的特性之一。 懶載入的好處: 可以減少程式本身因為與資料庫頻繁互動資料所導致的處理速度緩慢。 對懶載入異常的分析: 實驗程式碼如下: Department類: publ

Hibernate載入的三解決方案

Hibernate懶載入的兩種解決方案: 1.Hibernate.initialize(代理物件) 2.在*.hbm.xml對映檔案中新增lazy="false"屬性 3.使用opensess

Hibernate載入問題解決

解決Hibernate:could not initialize proxy-no Session 出現的問題:不能初始化,沒有session(session關閉)    在Hibernate中,<many-to-one ../>中的lazy預設為proxy,這

spring boot hibernate 載入解決方案

spring boot 是快速構建微服務的新框架。對於資料訪問問題可以直接使用jpa技術,但是在單元測試發現spring jpa存在hibernate懶載入問題。hibernate懶載入異常但是spring-boot沒有xml配置檔案所以現在網路上好多的解決方案並不能適用在spring boot框架中。在遇到

Hibernate載入常見問題及解決方案

什麼是懶載入? 懶載入(Load On Demand)是一種獨特而又強大的資料獲取方法,它能夠在使用者滾動頁面的時候自動獲取更多的資料,而新得到的資料不會影響原有資料的顯示,同時最大程度上減少伺服器端的資源耗用。(百度說的) 通俗點,就是在找一個物件時不找出

Hibernate載入異常的解決與深刻分析

出現原因:            Hibernate允許對關聯物件及屬性延遲載入,前提是這個操作在同一個Hibernate session範圍內進行.如果發生這樣的情況,當service層返回了一個

hibernate載入異常解決方案.

本文章主要講解hibernate套上spring,struts2/springMVC,出現的懶載入異常. 懶載入異常是由於session的關閉引起的 , 一般是出現在當資料從controller控制層傳到view前臺頁面進行迭代時出 現  ,  大多數情況下, 我們會將事

徹底解決SSH架構中的Hibernate載入問題

       在客戶端使用AJAX框架,服務端採用Struts2+Spring+Hibernate的架構中,經常會遇到Hibernate懶載入的問題 ,異常為: org.hibernate.LazyInitializationException: failed to la

【java】itoo項目實戰之hibernate 載入優化性能

bsp xtra extra pda 程序 前端框架 外連接 獲取 轉換成 在做itoo 3.0 的時候,考評系統想要上線,就開始導入數據了,僅僅導入學生2萬條數據,可是導入的速度特別的慢。這個慢的原因是由於導入的時候進行了過多的IO操作。可是導入成功之後,

UML中常用的幾圖——用例圖

多個 spa log 分享 擴展 有關 包圖 可見 發的 1.UML簡介   統一建模語言(Unified Modeling Language,UML)又稱標準建模語言,是始於1997年的一個OMG標準,它是一個支持模型化和軟件系統開發的圖形化語言,為軟件開發的所有階段提供

解決瀏覽器不執行javascript的問題

文檔 解決 scrip intern 手機瀏覽器 字符串 xxx 兼容 允許 昨天寫了一個網站,在PC端的chrome瀏覽器以及蘋果手機,以及安卓手機中的部分QQ瀏覽器都完美運行,但是在IE11以及其他的一些手機瀏覽器上運行時發現javascript根本沒有調用。我在網上找

SSH:hibernate載入導致的no Session

在hibernate中,我們經常會設定兩個實體之間的關係為 <one-to-one> <many-to-many> <one to many> 用來描述兩張表之間的關係,如一個員工有多種職務,而一個職務由多個員工擔任,我們在查詢員工的時候,需

C語言中的兩語句

我們都知道學習C語言都會遇到兩種常見的語句:選擇語句,迴圈語句。今天就讓我們一起來簡單看看這些語句的特點及功能吧! 選擇語句 if語句,用來實現兩個分支的選擇結構。 switch語句,用來實現多分支的選擇結構。 比如這裡有一個選擇語句: #include&