1. 程式人生 > 實用技巧 >解決JPA中懶載入資料庫會話(Session)關閉無法獲取的問題

解決JPA中懶載入資料庫會話(Session)關閉無法獲取的問題

Hibernate允許對關聯物件、屬性進行延遲載入,但是必須保證延遲載入的操作限於同一個Hibernate Session範圍之內進行。如果Service層返回一個啟用了延遲載入功能的領域物件給Web層,當Web層訪問到那些需要延遲載入的資料時,由於載入領域物件的Hibernate Session 已經關閉,這些導致延遲載入資料的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。

OpenSessionInViewFilter的主要功能是使每個請求過程繫結一個Hibernate Session,即使最初的事務已經完成了,也可以在Web層進行延遲載入的操作。OpenSessionInViewFilter過濾器將Hibernate Session繫結到請求執行緒中,它將自動被Spring的事務管理器探測到。

所以OpenSessionInViewFilter適用於Service層使用HibernateTransactionManager或JtaTransactionManager進行事務管理的環境,也可以用於非事務只讀的資料操作中。
request-->open session-->開啟連線、開始事務-->持久操作-->渲染(關閉連線、session)-->response 其中一些過程省略了,不是很關心。

另:JPA需要的sessionFilter配置如下:

<!--實體管理器過濾器 防止在檢視層懶載入的實體由於session關閉而出現異常的情況  -->
	<filter>
		<filter-name>openEntityManagerInViewFilter</filter-name>
		<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openEntityManagerInViewFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>