解決JPA中懶載入資料庫會話(Session)關閉無法獲取的問題
阿新 • • 發佈:2020-09-14
Hibernate允許對關聯物件、屬性進行延遲載入,但是必須保證延遲載入的操作限於同一個Hibernate Session範圍之內進行。如果Service層返回一個啟用了延遲載入功能的領域物件給Web層,當Web層訪問到那些需要延遲載入的資料時,由於載入領域物件的Hibernate Session 已經關閉,這些導致延遲載入資料的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。
OpenSessionInViewFilter的主要功能是使每個請求過程繫結一個Hibernate Session,即使最初的事務已經完成了,也可以在Web層進行延遲載入的操作。OpenSessionInViewFilter過濾器將Hibernate Session繫結到請求執行緒中,它將自動被Spring的事務管理器探測到。
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>