我希望可以配置spring管理hibernate事务,当一个service调用多dao的时候,全部save成功才commit,可以怎么实现? 
这是配置文件
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />   
  
<bean id="accountManagerTarget" class="com.vas.brd.service.impl.AccountManagerImpl">   
  <property name="userOrderDAO"><ref local="userOrderDAO"/></property>   
</bean>   
  
<bean id="accountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">   
  <property name="transactionManager"><ref local="transactionManager"/></property>   
  <property name="target"><ref local="accountManagerTarget"/></property>   
  <property name="transactionAttributes">   
    <props>   
      <prop key="save*">PROPAGATION_REQUIRED</prop>   
      <prop key="remove*">PROPAGATION_REQUIRED</prop>   
      <prop key="*">PROPAGATION_REQUIRED</prop>   
    </props>   
  </property>   
</bean>   
/*******************************************************************************/  sevice就没写了public class AccountManagerImpl implements AccountManager {   
  
    public SyncResponseInfo saveKnSyncData(){   
        //1   
        dao.saveObject2(object1);   
        //2   
        dao.saveObject1(object2)); //当1成功,2失败.1提交的数据不会回滚????。
    }   
}  如何才能实现这种,是不是不应该用这种事务管理?有高手帮忙详细解释一下关于事务的内容?
我这问题和这个贴差不多,但回答的结果也不是很理想:
http://topic.csdn.net/t/20050922/11/4286441.html

解决方案 »

  1.   

    你现在配置的事物管理,在saveKnSyncData就是一次性完全提交或者回滚嘛。有什么问题。
      

  2.   

    dao.saveObject2(object1);  
            //2  
    dao.saveObject1(object2)); //当1成功,2失败.1提交的数据不会回滚当1成功,2失败.1提交的数据不会回滚啊
      

  3.   

    http://download.csdn.net/source/1972099
      

  4.   

    建议你用声明式事务..具体配置如下:
     <!--transsactionManager-->
        <bean id="transactionManager"
                  class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>    <!--advisor-->
        <tx:advice id="txAdvice1" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="add*" propagation="REQUIRED"/>
                <tx:method name="modify*" propagation="REQUIRED"/>
                <tx:method name="del*" propagation="REQUIRED"/>
                <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
            </tx:attributes>
        </tx:advice>    <!--设置哪些类配置声明式事务-->
        <aop:config>
            <aop:pointcut id="pointcut1" expression="execution (* com.mkk.ssh.service.*.*(..))"/>
            <aop:advisor advice-ref="txAdvice1" pointcut-ref="pointcut1"/>
        </aop:config>要不用使用Hibernate的currentSession.也可以.
      

  5.   

    “2失败”时抛出的是 checked 异常还是 unchecked 异常?有没有自已 catch ?有没有考虑过 rollback-for 的配置?
      

  6.   

    <!-- 事务管理实体 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean>

    <!-- 事务配置 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!-- 查询方法只读 -->
    <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
    <!-- 其它方法使用普通事务 -->
    <tx:method name="insert*" propagation="REQUIRED" />
    <tx:method name="delete*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>

    <!-- aop切入 -->
    <aop:config>
    <aop:pointcut expression="execution(* com.ssh.service.*.*(..))" id="interCut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="interCut"/>
    </aop:config>
      

  7.   


    是checked受控异常,应该就是这个原因了.
    在这种配置当中没有rollback-for这个属性,看来只能使用<tx:method>或者使用@Transactional1.
    <!-- 配置事务通知 --> 
        <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
            <tx:attributes> 
                <tx:method name="save*" rollback-for="Exception"/> 
            </tx:attributes> 
        </tx:advice> 
    2.@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)难道我的这种配置里在这种情况就不能够让它回滚,还是我没有找到像rollback-for这种属性.谢谢你的回答