Spring 為我們提供了一個叫做 OpenSessionInViewFilter 的過濾器,他是标準的 Servlet Filter 是以我們把它按照規範配置到 web.xml 中方可使用。使用中我們必須配合使用 Spring 的 HibernateDaoSupport 來進行開發,也就是說,我們的dao層的類都要繼承于 HibernateDaoSupport,從中由 Spring 來控制 Hibernate 的 Session 在請求來的時候開啟,走的時候關閉,保證了我們通路資料對象時的穩定性。
OpenSessionInViewFilter的主要功能是用來把一個Hibernate Session和一次完整的請求過程對應的線程相綁定。Open Session In View在request把session綁定到目前thread期間一直保持hibernate session在open狀态,使session在request的整個期間都可以使用,如在View層裡PO也可以lazy loading資料,如 ${ company.employees }。當View 層邏輯完成後,才會通過Filter的doFilter方法或Interceptor的postHandle方法自動關閉session。
1. 在 web.xml 中加入對應過濾器配置檔案
Java代碼
- <!-- Spring的OpenSessionInView實作 -->
- <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>
- <!--
- 指定org.springframework.orm.hibernate3.LocalSessionFactoryBean在spring配置檔案中的名稱,預設值為sessionFactory。 如果LocalSessionFactoryBean在spring中的名稱不是sessionFactory,該參數一定要指定,否則會出現找不到sessionFactory的例外。是以預設可以不寫
- -->
- <init-param>
- <param-name>sessionFactoryBean</param-name>
- <param-value>sessionFactory</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>openSessionInViewFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
2. 在我們通路持久層資料是使用 Spring 為我們的 HibernateDaoSupport 的支援,并使用其中的對應方法操作我們的持久層資料