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

Java Spring数据JPA上的嵌套@Transactional注释行为,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,我有一个实体用户、一个使用Spring数据JPA的Repository/Dao类UserDao和一个带有方法addUser注释为@Transactional的服务类UserService: UserDao就是这样的: @Transactional public interface UserDao extends CrudRepository<User, Long> { } 阅读Spring数据JPA和关于同一个参数的其他问题,我的期望是,如果出现错误,标记为@Transaction

我有一个实体用户、一个使用Spring数据JPA的Repository/Dao类UserDao和一个带有方法addUser注释为@Transactional的服务类UserService:

UserDao就是这样的:

@Transactional
public interface UserDao extends CrudRepository<User, Long> { }
阅读Spring数据JPA和关于同一个参数的其他问题,我的期望是,如果出现错误,标记为@Transactional的方法中的每个操作都将回滚

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

您需要将内容添加到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>

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

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

@Transactional(rollbackFor=Exception.class)
public void addUser() throws Exception {

}

对谢谢,我将Exception更改为RuntimeException,现在所有的工作都如我所期望的那样。当这一点得到很好的解释时,您是否有一些参考资料?请参阅下面给出的一些示例:原因是什么?为什么只有未检查的异常才会导致回滚?谢谢,我使用的是Spring Boot的默认配置,我没有任何配置文件。好的,我还没有使用Spring Boot。。但据我所知,他只是给了嵌入式容器通猫等。。。无论如何,祝你好运:顺便说一句,CRUD方法在默认情况下是事务性的,所以你不必明确地标记你的回购协议-
@Transactional(rollbackFor=Exception.class)
public void addUser() throws Exception {

}