總結懶加載的解決方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session


如下錯誤:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

原因是懶加載的問題,因為hibernate的機制是當我們查詢一個對象的時候,在默認情況下,返回的只是該對象的普通屬性,當用戶去使用對象屬性的時候,才會向數據庫再一次查詢,可以這時session已經關閉了,無法對數據庫進行查詢。

舉例:在界面mainFrame.jsp中顯示雇員所在的部門名稱${loginuser.department.name }

解決方法:(強烈推薦方法三和方法四,如果是簡單解決可以采用方法一,二)

方法一:修改對象關系文件,取消懶加載,在Department.hbm.xml中做如下修改:

<class name="Department" lazy="false" table="department">

方法二:顯示初始化,在從數據庫中獲取Employee的地方,添加:

//select預先查詢
Hibernate.initialize(employee.getDepartment());

總結:方法一和方法二,雖然簡單,但是不管后面是否使用Department對象,都會向數據庫發出sql語句。我們希望后面需要用Department的時候,才去查數據庫,不使用的時候不查數據庫。

方法三:spring專門提供了openSessionView來解決懶加載,也就是說擴大session的作用范圍

不做處理前,session的作用范圍,僅僅在service處調用開始,service處結束。可以使用過濾器,擴大session的作用范圍,讓他在整個過程都可以起作用

本質是使用過濾器來管理事務的開始和提交

在web-xml文件中做如下配置:

<!-- 配置openSessionView解決懶加載 -->
<
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>

總結:openSeesionView可以有效的解決懶加載問題,並保證需要對象屬性時才查詢數據庫,但是會使得和數據庫保持的session時間延長

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM