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和关于同一个参数(1,2)的其他问题时,我的期望是,如果发生错误,标记为@Transactional
的方法中的每个操作都将回滚
我做错了什么? 如果发生错误,是否有方法回滚上一示例中的保存操作强>
# 1 楼答案
您的理解是正确的,但是自动回滚只在运行时发生,未经检查的异常
因此,假设事务管理器配置正确,要在非运行时回滚,请在事务注释中添加rollbackFor属性:
# 2 楼答案
您需要将内容添加到Xml配置文件中。。您需要添加trnasaction管理器
假设您的数据源是: