通常在ssh架构中,我们是在Spring中管理事务的. Spring容器可以对事务进行自动提交和回滚.但是Spring对事务进行回滚的时候只能是对于抛出 RuntimeException 或其子类的异常。
    
    在测试的时候发现如果 getHibernateTemplate().saveOrUpdate 出错时抛出的异常是 java.sql.BatchUpdateException(不是 RuntimeException 的子类),设置断点的时候发现程序也没有执行到 catch 里面就停了
 
    有两个疑问:
    1. 这样岂不是Spring不能自动回滚事务
    2. 为什么在Dao层写的 save 方法中 saveOrUpdate 出现异常的时候程序不能执行到 catch 里面
public <T> void save(T entity) throws Exception {
     try {   
            this.getHibernateTemplate().saveOrUpdate(entity);                
     } catch (Exception e) {   
            throw new RuntimeException(e);   
     }   
}

解决方案 »

  1.   

    你要先明白你spring是拦截DAO是那个!!你拦截了吗!!事务要是没起到作用的话就得看看配置文件!
      

  2.   

    我的问题和 http://www.iteye.com/topic/18152 这个帖子是差不多的,就是如果数据库抛出 java.sql.BatchUpdateException,  dao和 service 死活 catch 不到异常, 只能在 action 中 catch 到
      

  3.   

    第一点可以在配置文件中配置 rollback-for,第二点搞不明白
      

  4.   

    请看下你的spring配置文件,你是对DAO类的save方法加的事务吗?