有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring数据JPA上的java嵌套@Transactional注释行为

我有一个实体User,一个存储库/Dao类UserDao(使用Spring数据JPA)和一个服务类UserService,方法addUser注释为@Transactional

@Service
public class UserService {

  @Autowired
  private UserDao userDao;

  @Transactional
  public void addUser() throws Exception {

    User user = new User();
    user.setUsername("aaa");

    // Save the user, but since this method have the @Transactional
    // annotation it should not be committed....
    userDao.save(user);

    // Forcing an error here I expected that the previous operation
    // were rolled back.. Instead the user is saved in the db.
    if ("".equals("")) {
      throw new Exception("something fails");
    }

    // Other operations (never executed in this example)
    user.setUsername("bbb");
    userDao.save(user);

    return;
  } // method addUser

} // class UserService

{}就是这样:

@Transactional
public interface UserDao extends CrudRepository<User, Long> { }

阅读Spring数据JPAdocumentation和关于同一个参数(12)的其他问题时,我的期望是,如果发生错误,标记为@Transactional的方法中的每个操作都将回滚

我做错了什么? 如果发生错误,是否有方法回滚上一示例中的保存操作


共 (2) 个答案

  1. # 1 楼答案

    您的理解是正确的,但是自动回滚只在运行时发生,未经检查的异常

    因此,假设事务管理器配置正确,要在非运行时回滚,请在事务注释中添加rollbackFor属性:

    @Transactional(rollbackFor=Exception.class)
    public void addUser() throws Exception {
    
    }
    
  2. # 2 楼答案

    您需要将内容添加到Xml配置文件中。。您需要添加trnasaction管理器

     <tx:annotation-driven transaction-manager="txMgrDataSource" />
    
    <!  Creating TransactionManager Bean, since JDBC we are creating of type
        DataSourceTransactionManager  >
    <bean id="txMgrDataSource"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="DataSource" />
    </bean>
    

    假设您的数据源是:

    <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="####" />
        <property name="url"
                  value="jdbc:sqlConnection" />
        <property name="username" ref="user" />
        <property name="password" ref="pass" />
    
    </bean>