论坛首页 Java企业应用论坛

action可否直接使用spring的声明式事务?

浏览 9423 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-23   最后修改:2008-12-23
由于图省事,而且系统比较小,感觉service层比较繁琐,就直接在action里调用的dao
现在想使用事务 action代码大致如下
public ActionForward addOrg(
orginfoDAO.insert(orginfo);
userDAO.insert(userInfo);
}


action里有这样的两个操作,分别用两个dao去处理,我想加上事务处理,使用的spring配置好像还是1.X的(见笑)
使用HibernateTransactionManager 和TransactionProxyFactoryBean类去管理事务,在target里设置target为action的bean name
    
  <bean id="transactionManager"   
       class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <bean id="orgManagerProxy" lazy-init="true"   
         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager"><ref bean="transactionManager"/>
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
                    <prop  
                    key="add*">PROPAGATION_REQUIRED,Exception</prop>                      
                    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
                </props>
            </property>
             <property name="target">    
	             <ref="/userOrgManager">
            </property> 
       </bean>  

action bean定义如下
 <bean  name="/userOrgManager"
	           class="web.manager.ManagerAction">
	           <property name="baseDAO">
	             <ref local="baseDAO"/>
	           </property>
	           <property name="userDAO">
	             <ref local="userDAO"/>
	           </property> 
	           <property name="orginfoDAO">
	             <ref local="orginfoDAO"/>
	           </property>         
	    </bean>  


但是这样配置是不生效的,直接使用TransactionProxyFactoryBean去管理dao的话,只能是单个dao进入事务管理,比较郁闷,如果有service层的话,可以用action去调用包装好的带事务的service,但现在这样配置后使用action依然是没有包装过的原始action,不知道怎么配比较好,还是非得加service层呢?希望大家指教。我用编程式事务去管理是可以的,但是比较麻烦,想用直接注入实现一下。
   发表时间:2008-12-23  
可以.....
还可以opensessioninview
0 请登录后投票
   发表时间:2008-12-23  
抛出异常的爱 写道

可以.....还可以opensessioninview

那请问我是哪里配置出问题了?谢谢指点!
0 请登录后投票
   发表时间:2008-12-23  
如果你没有用opensessioninview的话在调用dao之后hibernateTemplete会自动关闭session
0 请登录后投票
   发表时间:2008-12-23  
框架调用的是/userOrgManager这个bean,你的事务配置根本不会起作用
0 请登录后投票
   发表时间:2008-12-23   最后修改:2008-12-23
<bean name="/userOrgManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
     <property name="transactionManager"><ref bean="transactionManager"/></property>  
           <property name="transactionAttributes">  
               <props>  
                   <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>  
                  <prop    
                   key="add*">PROPAGATION_REQUIRED,Exception</prop>                        
                   <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>  
               </props>  
           </property>  
           <property name="target">      
              <bean  class="web.manager.ManagerAction">  
                  <property name="baseDAO">  
                     <ref local="baseDAO"/>  
                  </property>  
                  <property name="userDAO">  
                     <ref local="userDAO"/>  
                  </property>   
                  <property name="orginfoDAO">  
                     <ref local="orginfoDAO"/>  
                  </property>           
              </bean>  
           </property>   
      </bean>
0 请登录后投票
   发表时间:2008-12-24  
daquan198163 写道

框架调用的是/userOrgManager这个bean,你的事务配置根本不会起作用

嗯 我就是不知道怎么才能起作用 呵呵
必须得用service层么?
0 请登录后投票
   发表时间:2008-12-24  
herowzz 写道

如果你没有用opensessioninview的话在调用dao之后hibernateTemplete会自动关闭session


这个不是的吧?我直接在action里使用编程式事务是可以的
0 请登录后投票
   发表时间:2008-12-24  
daquan198163 写道
<bean name="/userOrgManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
     <property name="transactionManager"><ref bean="transactionManager"/></property>  
           <property name="transactionAttributes">  
               <props>  
                   <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>  
                  <prop    
                   key="add*">PROPAGATION_REQUIRED,Exception</prop>                        
                   <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>  
               </props>  
           </property>  
           <property name="target">      
              <bean  class="web.manager.ManagerAction">  
                  <property name="baseDAO">  
                     <ref local="baseDAO"/>  
                  </property>  
                  <property name="userDAO">  
                     <ref local="userDAO"/>  
                  </property>   
                  <property name="orginfoDAO">  
                     <ref local="orginfoDAO"/>  
                  </property>           
              </bean>  
           </property>   
      </bean>


谢谢大哥的详细解答 我用这个配置可以运行,但是还是没起作用
transactionAttributes里还必须把<prop key="*">给去了才行,不知道为什么action里调用的orginfoDAO.insert(orginfo);  不包括在 <prop key="insert*">内,也不算在 <prop    key="add*">里,action用到的方法是addOrg(),加上<prop key="*">它就说是readonly的,不能进行insert操作。
我的baseDAO是userDAO和orginfoDAO的父类,是使用hibernateTemplate进行操作的,hibernate.connection.autocommit设置为true,不然不用事务没法保存数据,我查了查有人说这个配置下声明式事务也是有效的,spring会自动更改代理dean的autocommit属性
0 请登录后投票
   发表时间:2008-12-26  

我猜测原因是ManagerAction的基类导致的,
因为框架不是直接调用ManagerAction的方法,而是同意调用Action基类的入口方法(例如handleRequest),然后反射调用你的具体方法,因此你需要为这个入口方法指定事务属性
简单办法就是用通配符把所以方法都包括进去:
transactionAttributes设为<prop key="*">PROPAGATION_REQUIRED</prop>
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics