最近在参照项目实例学习Hibernate,Spring. 看到web.xml 当中都使用了OpenSessionInViewFilter,但是读书当中可能读了就很快过去了,没有留下印象,再google一下,查阅资料。网络上资料是如下解释这个filter的。
如果你的应用中hibernate是通过spring 来管理它的session,如果在你的应用中没有使用opensessioninviewfilter 或者 opensessioninviewinterceptor。session会在transaction结束后关闭。
它是一个Servlet2.3过滤器,用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。例如:它允许在事务提交之后延迟加载显示所需要的对象。
OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。
- OpenSessionInViewFilter
- org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
- < singleSessiontruefalseOpenSessionInViewnbsp >
- singleSession
- true
- OpenSessionInViewFilter
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.COMMIT);
return session;
}
protected void closeSession(Session session, SessionFactory factory) {
session.flush();
super.closeSession(session, factory);
}
}但是修改就没有问题吗?可能会导致性能的下降! 详细参考:http://dev.yesky.com/255/2605755.shtml
所以感觉上,是不要覆盖旧的子类,使用OpenSessionInViewFilter的地方尽可能不要有数据修改的事物,如果实在有,可能需要自己来控制了。
Spring的OpenSessionInViewFilter和OpenSessionInViewInterceptor
关键字: hibernate懒加载 opensessioninview对Hibernate的懒加载问题,Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor两种东西。
对OpenSessionInViewFilter,需要在web.xml文件中配置。
- < span>filter<
- < span>description<处理Hibernate的懒加载问题description<
- < span>filter-name<OpenSessionInViewFilterfilter-name<
- < span>filter-class<
- org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
- filter-class<
- < span>init-param<
- < span>description<
- 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里
- 指定这个名字。
- description<
- < span>param-name<sessionFactoryBeanNameparam-name<
- < span>param-value<localSessionFactoryparam-value<
- init-param<
- < span>init-param<
- < span>description<description<
- < span>param-name<singleSessionparam-name<
- < span>param-value<trueparam-value<
- init-param<
- filter<
- < span>filter-mapping<
- < span>filter-name<OpenSessionInViewFilterfilter-name<
- < span>url-pattern<*.dourl-pattern<
- filter-mapping<
默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里指定这个名字。
- < span>init-param<
- < span>description<
- 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里
- 指定这个名字。
- description<
- < span>param-name<sessionFactoryBeanNameparam-name<
- < span>param-value<localSessionFactoryparam-value<
- init-param<
其中的sessionFactoryBeanName是你的SessionFactory的实例的名字。这个名字是你在Spring的Bean定义文件中声明的SessionFactory的实例的bean名字。默认这个Filter会使用“sessionFactory”这个值,如果你的SessionFactory确实是这个名字的话,可以不用指明它的名字。但是如果你向我一样,给SessionFactory使用了其他名字,就得在这里声明了。
对OpenSessionInViewInterceptor,就纯粹是Spring IOC容器管理的东西了。
首先,你需要在Spring中声明一个OpenSessionInViewInterceptor的实例
- < span>bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"<
- < span>property name="sessionFactory" ref="localSessionFactory" /<
- bean<
然后,你需要在bean urlMapping 中使用这个interceptor:
- "urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"<
- <:property nbspname=""interceptors"<
- "openSessionInViewInterceptor" /<
- <:property nbspname=""mappings"<
- "main.do"<mainFrameController
在实际应用中,发现一个奇怪的现象,就是使用OpenSessionInViewFilter以后,发现竟然有时候懒加载会出错,因为时间紧迫,还没有找到原因是什么。但是在使用了OpenSessionInViewInterceptor以后,这个问题解决了。
有空的时候再来看到底是什么原因。