先看spring配置文件<!-- 声明事务 -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(* com.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
</aop:config>再看service方法package com.service.impl;public class UserServiceImpl implements UserService { private UserDao userDao; public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}

public void saveUser(USM_USER User) {
this.userDao.saveObject(User);
//做2次插入,按道理第二次会失败,那应该要回滚第一次的插入吧
this.userDao.saveObject(User);
}
}其中userDao继承至BaseDao,底层方法没有把异常抛出,底层自行处理了
详细请看BaseDaoImpl的部分方法public Serializable saveObject(E entity) {
Serializable id = null;
try {
id = getHibernateTemplate().save(entity);
} catch (Exception e) {
logger.error("保存实体对象异常,对象是" + entity, e);
return null;
}
return id;
} public boolean saveOrUpdateObject(E entity) {
try {
getHibernateTemplate().saveOrUpdate(entity);
return true;
} catch (Exception e) {
logger.error("保存或者更新实体对象异常,对象是" + entity, e);
return false;
}
}为什么配置的事物无效呢??

解决方案 »

  1.   

    LZ试试在service层里面try一下、或者直接throws!!!
      

  2.   

    记得底层方法要把异常抛出、这样service层扑捉到了过后、才知道底层出错了、知道出错了、才会回滚!
      

  3.   

        <tx:method name="save*" propagation="SUPPORTS" read-only="true"/>
                <tx:method name="del*" propagation="SUPPORTS" read-only="true"/>
                <tx:method name="update*" propagation="SUPPORTS" read-only="true"/>
                <tx:method name="*" propagation="REQUIRED" />这样试试
      

  4.   

    改了,还是没用第一个USER顺利的插入了数据库,第二个后台报错了,但是事物没有回滚
      

  5.   

    你是肿么改的???
    代码帖出来看看!!!
    底层跟service的!
      

  6.   

    public Serializable saveObject(final E entity) throws Exception;异常在Service层捕捉后还是不能回滚
      

  7.   

    再理一理,我底层的DAO是不是要throws异常给Service处理(打印日志等..)??还是Service层需要把异常向外抛出(这一层再向外抛出可就是交给Action来处理异常了..)
      

  8.   

    又或者是你的dao方法、写到了execution(* com.service.impl.*.*(..))这个切面下面、它执行完dao方法的时候、已经提交了!
      

  9.   


    public void saveUser(USM_USER User) {
    try {
    System.out.println("====");
    System.out.println("====");
    this.userDao.saveObject(User);
    System.out.println("====");
    System.out.println("====");
    System.out.println("====");
    System.out.println("==5==");
    USM_USER u = new USM_USER();
    this.userDao.saveObject(u);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    DEBUG了一直到System.out.println("==5==");的时候都没有插入数据库,没有发出SQL语句。直到this.userDao.saveObject(u);再次插入的时候然后控制台报异常了,将第一个插入语句发出。
    控制台日志如下Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.entity.USM_USER
    at org.hibernate.id.Assigned.generate(Assigned.java:33)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
    at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:697)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    ... 90 more
    Hibernate: 
        insert 
        into
            USM_USER
            (orgCode, password, state, userName, loginName) 
        values
            (?, ?, ?, ?, ?)
    Hibernate: 
      

  10.   

    spring只会在发生RuntimeException及其子类的异常时回滚。
    在dao层的抛个RuntimeException异常到service层,这样spring应该可以起作用了
      

  11.   

    设个切面 抓到错误就回滚 @throwable 去文档里查这个就明白了
      

  12.   

    我的是注解:@Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class)你需要指定什么类的异常才进行回滚、
    或者什么样的异常不回滚、
      

  13.   

    非常感谢大家,确实是应该在service抛出RuntimeException,这样spring事物才有效