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>