OpenSessionInView

什麼是OpenSessionInView在hibernate中使用load方法時,並未把數據真正獲取時就關閉了session,當我們真正想獲取數據時會迫使load載入數據,而此時session已關閉,所以就會出現異常。

基本介紹

  • 中文名:OpenSessionInView
  • 外文名:OpenSessionInView
  • 前提:load方法時
  • 作用:解決了此問題
簡介,解決方案,

簡介

比較典型的是在MVC模式中,我們在M層調用持久層獲取數據時(持久層用的是load方法載入數據),當這一調用結束時,session隨之關閉,而我們希望在V層使用這些數據,這時才會迫使load載入數據,我們就希望這時的session是open著得,這就是所謂的Open Session In view 。 我們可以filter來達到此目的。下面的代碼初步解決了此問題:
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){
try{
Session session = ...SessionFactory.getCurrentSeesion(); //得到session對象
tx = session.beginTransaction(); //開啟事務
chain.doFliter(request,response); //傳遞給下一個
tx.commit(); //提交事務
}catch (Exception e){
//出現異常,回滾事務
}
}
簡析:當請求到達時,會首先被此攔截器攔截,當數據經過獲取並在V層顯示完畢後,回到此Filter內部,此時提交事務-->關閉session。

解決方案

OpenSessionInViewFilter [全名:org.springframework.orm.hibernate3.support.OpenSessionInViewFilter]是Spring提供的一個針對Hibernate的一個支持類,其主要意思是在發起一個頁面請求時打開Hibernate的Session,一直保持這個Session,直到這個請求結束,具體是通過一個Filter來實現的。
由於Hibernate引入了Lazy Load特性,使得脫離Hibernate的Session周期的對象如果再想通過getter方法取到其關聯對象的值,Hibernate會拋出一個LazyLoad的Exception。所以為了解決這個問題,Spring引入了這個Filter,使得Hibernate的Session的生命周期變長。
有兩種方式可以配置實現OpenSessionInView,分別是OpenSessionInViewInterceptor和OpenSessionInViewFilter,功能完全相同,只不過一個在web.xml配置,另一個在application.xml配置而已。我個人比較傾向配置在application.xml里,因為web.xml里配置的東西的太多的話容易發生衝突,雖然可以調整,但是畢竟多了個麻煩。
OpenSessionInViewInterceptor配置:
<beans>
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor"/>
</list>
</property>
<property name="mappings">
......
</property>
</bean>
......
</beans>
OpenSessionInViewFilter配置: (此監聽器應該在struts2的監聽器前面)
<web-app>
......
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
......
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
......
</web-app>

相關詞條

熱門詞條

聯絡我們