Open Session in View

来源:互联网 发布:led显示屏软件密码 编辑:程序博客网 时间:2024/06/06 14:12


<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
  </filter>

说明一下Open Session in View的作用,就是允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期lazy loading数据。 
如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernate session,而是每个数据访问都会产生各自的seesion,等于没有Open Session in View。
OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never 
代码: 
    protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException { 
       Session session = SessionFactoryUtils.getSession(sessionFactory, true); 
       session.setFlushMode(FlushMode.NEVER); 
       return session; 
    } 
看getSession的方式就知道,把flush mode 设为FlushMode.NEVER,这样就算是commit的时候也不会session flush, 
如果想在完成request过程中更新数据的话, 那就需要先把flush model设为FlushMode.AUTO,再在更新完数据后flush.

OpenSessionInView默认的FlushMode为 
代码:

FlushMode.NEVER 


可以采用在写保存更新删除代码的时候手动更改FlushMode 
代码:

         this.getHibernateTemplate().execute(new HibernateCallback() { 
             public Object doInHibernate(Session session) throws HibernateException { 
                 session.setFlushMode(FlushMode.AUTO); 
                 session.save(user); 
                 session.flush(); 
                 return null; 
             } 
         }); 


但是这样做太繁琐了,第二种方式是采用spring的事务声明 
代码:

     <bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
           abstract="true"> 
         <property name="transactionManager" ref="transactionManager"/> 
         <property name="proxyTargetClass" value="true"/> 
         <property name="transactionAttributes"> 
             <props> 
                 <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> 
                 <prop key="save*">PROPAGATION_REQUIRED</prop> 
                 <prop key="add*">PROPAGATION_REQUIRED</prop> 
                 <prop key="update*">PROPAGATION_REQUIRED</prop> 
                 <prop key="remove*">PROPAGATION_REQUIRED</prop> 
             </props> 
         </property> 
     </bean> 
代码:

     <bean id="userService" parent="baseTransaction"> 
         <property name="target"> 
             <bean class="com.phopesoft.security.service.impl.UserServiceImpl"/> 
         </property> 
     </bean>
 

原创粉丝点击