spring OpenSessionInViewFilter opensessioninviewinterceptor

最近在参照项目实例学习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 进行事务管理的环境,也可以用于非事务只读的数据操作中。

  1. OpenSessionInViewFilter
  2. org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  3.     < singleSessiontruefalseOpenSessionInViewnbsp >
  4.    
  5.         singleSession
  6.         true
  7.    
  8. OpenSessionInViewFilter

  9.         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的地方尽可能不要有数据修改的事物,如果实在有,可能需要自己来控制了。

 
 
 
 
 
02

Spring的OpenSessionInViewFilter和OpenSessionInViewInterceptor

关键字: hibernate懒加载 opensessioninview
xml 代码

  对Hibernate的懒加载问题,Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor两种东西。

 

  对OpenSessionInViewFilter,需要在web.xml文件中配置。

xml 代码
  1. < span>filter<  
  2.   < span>description<处理Hibernate的懒加载问题description<  
  3.   < span>filter-name<OpenSessionInViewFilterfilter-name<  
  4.   < span>filter-class<  
  5.     org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
  6.   filter-class<  
  7.   < span>init-param<  
  8.     < span>description<  
  9.        默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里   
  10.        指定这个名字。   
  11.     description<  
  12.     < span>param-name<sessionFactoryBeanNameparam-name<  
  13.     < span>param-value<localSessionFactoryparam-value<  
  14.   init-param<  
  15.   < span>init-param<  
  16.     < span>description<description<  
  17.     < span>param-name<singleSessionparam-name<  
  18.     < span>param-value<trueparam-value<  
  19.   init-param<  
  20. filter<  
  21. < span>filter-mapping<  
  22.   < span>filter-name<OpenSessionInViewFilterfilter-name<  
  23.   < span>url-pattern<*.dourl-pattern<  
  24. filter-mapping<  


         默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里指定这个名字。

xml 代码
  1. < span>init-param<  
  2.   < span>description<  
  3.      默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里   
  4.      指定这个名字。   
  5.   description<  
  6.   < span>param-name<sessionFactoryBeanNameparam-name<  
  7.   < span>param-value<localSessionFactoryparam-value<  
  8. init-param<  

    其中的sessionFactoryBeanName是你的SessionFactory的实例的名字。这个名字是你在Spring的Bean定义文件中声明的SessionFactory的实例的bean名字。默认这个Filter会使用“sessionFactory”这个值,如果你的SessionFactory确实是这个名字的话,可以不用指明它的名字。但是如果你向我一样,给SessionFactory使用了其他名字,就得在这里声明了。

对OpenSessionInViewInterceptor,就纯粹是Spring IOC容器管理的东西了。

    首先,你需要在Spring中声明一个OpenSessionInViewInterceptor的实例

xml 代码
  1. < span>bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"<  
  2.   < span>property name="sessionFactory" ref="localSessionFactory" /<  
  3. bean<  

    然后,你需要在bean urlMapping 中使用这个interceptor:

java 代码
  1. "urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"<   
  2.   <:property nbspname=""interceptors"<   
  3.        
  4.       "openSessionInViewInterceptor" /<   
  5.        
  6.      
  7.   <:property nbspname=""mappings"<   
  8.        
  9.       "main.do"<mainFrameController   
  10.        
  11.      
  12.   

 

    在实际应用中,发现一个奇怪的现象,就是使用OpenSessionInViewFilter以后,发现竟然有时候懒加载会出错,因为时间紧迫,还没有找到原因是什么。但是在使用了OpenSessionInViewInterceptor以后,这个问题解决了。

    有空的时候再来看到底是什么原因。

你可能感兴趣的:(spring OpenSessionInViewFilter opensessioninviewinterceptor)