欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenSessionInViewFilter详细使用说明

程序员文章站 2022-07-14 12:12:25
...

这里我们要弄清楚的是为什么要使用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