OpenSessionInViewFilter详细使用说明

这里我们要弄清楚的是为什么要使用OpenSessionInViewFilter?我们是到到这个一般是解决延迟加载出现的问题。那么为什么会有问题呢,首先明确以下几点

  • session的开闭,Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。(这里明确下延迟加载,简单说就是当我们没有真正使用实体的属性,并不会触发查询hql,例如我们用到了用户实体的名称时候,才会真正操作数据库去查询)
  • spring提供的OpenSessionInViewFilter就解决了此问题。该filter会将session绑定至当前请求的线程上,这样只要是在当前请求的生命周期内,可以随时访问session,只需要在项目的web.xml文件中增加如下配置即可
	<filter> 
		<filter-name>OpenSessionInViewFilter</filter-name> 
		<filter-class> 
		org.springframework.orm.hibernate4.support.OpenSessionInViewFilter 
		</filter-class> 
		<init-param> 
			<param-name>sessionFactoryBeanName</param-name> 
			<param-value>sessionFactory</param-value> 
	   </init-param> 
	   <init-param> 

            <param-name>singleSession</param-name> 
            <param-value>true</param-value>            
        </init-param> 
        <init-param> 
			<param-name> flushMode </param-name> 
    		<param-value>COMMIT</param-value>         
        </init-param> 
	</filter> 
	
	
	<filter-mapping>
		<filter-name>OpenSessionInViewFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>  
  • 简单说下

FlushMode有5个值可选

Always:任何代码都会Flush
AUTO:默认方式–自动
Commit:COMMIT时
Never:始终不
MANUAL:手动方式

主要是配置何时与数据库同步,主要是因为hibernate的缓存机制,例如一个实体在缓存中存在,就不会查询据库 详细参考http://blog.csdn.net/lssssss/article/details/6839633

 

以上说明有个更详细文章http://blog.csdn.net/a19881029/article/details/7916702

猜你喜欢

转载自1010934061.iteye.com/blog/2177945