Spring為我們解決最讓人頭痛的難題之一,Hibernate的Session的關閉與開啟問題。
Hibernate 允許對關聯對象、屬性進行消極式載入,但是必須保證消極式載入的操作限於同一個 Hibernate Session 範圍之內進行。如果 Service 層返回一個啟用了消極式載入功能的領域對象給 Web 層,當 Web 層訪問到那些需要消極式載入的資料時,由於載入領域對象的 Hibernate Session 已經關閉,這些導致消極式載入資料的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是使每個請求過程綁定一個
Hibernate Session,即使最初的事務已經完成了,也可以在 Web 層進行消極式載入的操作。OpenSessionInViewFilter 過濾器將 Hibernate Session 綁定到請求線程中,它將自動被 Spring 的交易管理員探測到。所以 OpenSessionInViewFilter 適用於 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進行交易管理的環境,也可以用於非事務唯讀資料操作中。
一、手動載入 如:
Hibernate.initialize(obj.getUser());//載入使用者物件
二、使用OpenSessionInViewFilter 配置解決消極式載入 如:
<!--OpenSessionInViewFilter 解決消極式載入問題--> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> <!-- singleSession預設為true,若設為false則等於沒用OpenSessionInView --> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--Spring Context listener--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!--讓spring知道交易管理的bean所在--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <!--struts 2.0 過濾器配置--><filter> <filter-name>struts</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class></filter><filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern></filter-mapping>