在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。
并且,有些时候一个业务逻辑我们需要用到多个方法来完成这个业务,并在Action中调用,这个时候就会产生多次session的开启、关闭,导致不能保证数据都完整性与正确性,这时我们就需要一个请求对应一个session。同时请求开始开启一个session,请求结束销毁该session,所以要将一个请求对应一个session。
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
和
org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor
是Spring提供的一个针对Hibernate的一个支持类,主要是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,通过一个Filter来实现的。
有两种方式可以配置实现OpenSessionInView,分别是OpenSessionInViewInterceptor和OpenSessionInViewFilter,功能完全相同,只不过一个在web.xml配置,另一个在application.xml配置而已。如果用的spring mvc 就用openSessionInViewInterceptor,(称为拦截器模式)如果是用的struts2之类的mvc框架,就应该用OpenSessionInViewFilter (过滤器模式).
OpenSessionInViewFilter:
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为false则会在每次请求上产生各自都session,等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sf</param-value> <!-- 默认值sessionFactory -->
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>