ApplicationContext.xml:<!-- 事务管理器配置,单数据源事务 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />
Service层:@Transactional(rollbackFor = Exception.class)
public void saveActivity(Activity activity) throws Exception {
tripsDao.updateTrips(28);
if (1 == 1)
   throw new Exception("xxxxxxx");}
问题:
updateTrips这个方法是HQL语句,没有回滚事务getSession().createQuery("update Trips ts set ts.tstate = '1' where ts.tripsid = ? and ts.ttype = 1")
.setParameter(0, 28).executeUpdate();
      updateTrips这个方法是直接修改对象,回滚了事务
[code=Java]
getSession().saveOrUpdate(trips);[code]
各位大大帮帮忙解释下为什么呢?

解决方案 »

  1.   

    你用spring管理了事务,你的提交都有它去处理了,典型的像save,update,delete的操作,说白了就是你数据库中的数据要发生变化,那就要为你的方法进行配置,也就是说要在spring中配置。如果你的save。update,delete语句在插入或者修改或者删除时出现了错误,那spring便会为你去把事务回滚,这个过程你是看不到的。我只能说这么多了,你现在的问题没有说明白,说明白在让大伙帮你解决吧,我这里只是为你提个醒
      

  2.   

    配置spring的时候,要配置一下,含有哪些关键字的需要回滚,就可以啦
      

  3.   

    getSession().createQuery().executeUpdate();这里spring AOP使executeUpdate执行的时候,先创建一个事务,执行完方法后再提交事务,所以你不需要提交事务也能更新操作,因为spring AOP已经帮你提交了
      

  4.   

    你的异常怎么处理的~~~!!!
    你的dao底层要抛出给Service啊!
    然后你Spring监控Serivce里面的方法、!
    如果出错了它就给你回滚事务~~~!!!
    如果你dao底层没有将异常抛出、Service捕获不到、也就是没有异常!
    没有异常就不会给你回滚了!
    也不知道说的对不对!
    将就看吧!
      

  5.   

    用try{}catch(){
    }异常就回滚了- -!!
      

  6.   

    1 Exception 首先 Hibernate 是不回滚这种异常的,它只回滚 RuntimeException .
    2 没看到你写aop的 active (应该是这么写吧),
      

  7.   

    首先很感谢各位朋友的回答。
    不知道怎么在问题后面补充问题 -。-针对#1楼:
    问题嘛:简单来说就是Service层里的一个方法,调用Dao方法,Dao方法里是HQL实现的操作,在Service层里我手动声明异常,然后手动抛异常。无法回滚事务,如果Dao里直接操作对象就可以回滚,请问怎么解决。在这里补充两点:
    1、Dao层方法是没异常的,继承org.springside.modules.orm.hibernate.HibernateDao;
    2、就用annotation管理事务,不用其他的那种关键字的事务
    针对#2楼:
    就用annotation管理事务,不用其他的那种关键字的事务针对#3楼:
    诚如您说的,那怎么实现不让Aop提交呢,回滚呢。能讲的详细点吗?谢谢了针对#4楼:
    呵呵,谢谢针对#5楼:
    呵呵,不过Dao层方法没异常,
    @Transactional(rollbackFor = Exception.class)
    我就在Service层里进行声明异常,然后手动抛出一个异常。针对#6楼:
    刚开始就是用try...catch的,不行,然后就声明异常再抛出异常,都无法让Hql的操作回滚