解決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>


免責聲明!

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



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