这是我UserDAO实现类@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
private HibernateTemplate hibernateTemplate;
@Resource//让spring注入进来
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public void add(User u) {
hibernateTemplate.save(u);
}
}这是我的LogDAO的实现类
@Repository("logDAO")
public class LogDAOImpl implements LogDAO {
private HibernateTemplate hibernateTemplate;
@Resource//让spring注入进来
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
@Override
public void add(Log log) {
System.out.println("调用了LogDAO的add方法!");
hibernateTemplate.save(log);
throw new RuntimeException("日志打印异常!");
}
}这是我的UserService实现类@Service("userService")
public class UserServiceImpl implements UserService{
private UserDAO userDAO;
private LogDAO logDAO;
public UserDAO getUserDAO() {
return userDAO;
}
public LogDAO getLogDAO() {
return logDAO;
}
@Resource
public void setLogDAO(LogDAO logDAO) {
this.logDAO = logDAO;
}
@Resource
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Transactional
public void add(User u){
logDAO.add(new Log("a user saved!"));
userDAO.add(u);
}

}这是我的beans.xml文件<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd     
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--把com.hktk包下的东西交给spring管理 -->
<context:component-scan base-package="com.hktk" />
<!-- 加载properties文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.hktk.entity.user.User</value>
<value>com.hktk.entity.log.Log</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- 下面这两个配置是使用Spring整合Hibernate的声明式事务的annotation写法 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 使用hibernateTemplate配置-->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<!-- hibernateTemplate中的sessionFactory由下面注入给它 -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>下面的是我的jdbc.properties文件:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=wang问题是这样的:我在UserServiceImpl的add方法加上了spring的声明式异常的注解,我在add方法中,在向数据库添加一个User时同时用logDAO向数据库添加一条日志,我在logDAO的实现类中故意抛出RuntimeException,当我在测试方法中调用service的add方法时,并没有如期的两个操作都会回滚。log被插入到数据库中了,user并没有添加进去,到底怎么回事呢,好像声明式事务处理失效了??求高手啊!!!谢谢大家!

解决方案 »

  1.   

    其实就是在service中处理两个添加操作,该方法加了spring的声明式异常注解,其中一个操作抛出异常,但是事务却没有回滚,有一条数据还是插入到数据库中了!本人对spring了解不是很了解,希望各位高手帮忙解决问题!谢谢大家
      

  2.   

    @Transactional(rollbackFor=Exception.class)
    public void add(User u){
    ........
    }
      

  3.   

    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
    public void add(User u){
    logDAO.add(new Log("a user saved!"));
    userDAO.add(u);
    }
    我设置了,没有用啊,怎么回事呢?
      

  4.   

    @Transactional(rollbackFor=RuntimeException.class) ??
      

  5.   

    对UserDAOImpl,LogDAOImpl 两个类的add方法也注解下
    @Transactional(rollbackFor=Exception.class)
    public void add(User u) {}另外UserServiceImpl 的add方法,不调用其它类的方法,试试本身抛出异常后会不会回滚。
      

  6.   

    其实这个好像是我用的数据库是mysql的原因,我换成sqlserver以后,我原来的代码完美运行了!
      

  7.   

    你的mysql库类型是什么
    inneDB才支持事务
    MyISAM模式下,没有事务支持
      

  8.   

        @Override
        public void add(Log log) {
            System.out.println("调用了LogDAO的add方法!");
            hibernateTemplate.save(log);
            throw new RuntimeException("日志打印异常!");
        }
    让它抛给注解了Transactional的service,才会执行回滚。
    public void add(Log log) throws Execption{
            System.out.println("调用了LogDAO的add方法!");
            hibernateTemplate.save(log);
           // throw new RuntimeException("日志打印异常!");
        }