您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何解決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 { // 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{ //特殊的關閉方式 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請求的最后才關閉。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何解決Hibernate懶加載”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。