无法提交 JPA 事务:标记为仅回滚的事务
我正在开发的一个应用程序中使用Spring和Hibernate,但我在处理事务时遇到了问题。
我有一个服务类,它从数据库中加载一些实体,修改它们的一些值,然后(当一切都有效时)将这些更改提交到数据库。如果新值无效(我只能在设置后检查),我不想保留更改。为了防止Spring/Hibernate保存更改,我在方法中引发异常。但是,这会导致以下错误:
Could not commit JPA transaction: Transaction marked as rollbackOnly
这是服务:
@Service
class MyService {
@Transactional(rollbackFor = MyCustomException.class)
public void doSth() throws MyCustomException {
//load entities from database
//modify some of their values
//check if they are valid
if(invalid) { //if they arent valid, throw an exception
throw new MyCustomException();
}
}
}
这就是我如何调用它:
class ServiceUser {
@Autowired
private MyService myService;
public void method() {
try {
myService.doSth();
} catch (MyCustomException e) {
// ...
}
}
}
我期望发生的事情:不对数据库进行任何更改,也没有对用户可见的异常。
发生的情况:未对数据库进行任何更改,但应用崩溃:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction;
nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
它正确地将事务设置为仅回滚,但为什么回滚崩溃并出现异常?