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
上一篇: 使用nmap扫描服务器端口的一次操作
下一篇: 使用Varnish反向代理Tomcat
推荐阅读