我正在使用一个带有 @Transactional
注解的事务方法。我试图使用 JpaRepository 的 save() 方法将一个对象保存到数据库中,但由于数据库关系上的约束,它会抛出错误。
现在,当我调试程序时,我发现异常是在事务方法结束时抛出的,而不是在调用 save
方法时抛出。这与非事务方法的行为相当不同。
有人能解释一下为什么会这样吗?为什么异常是在事务方法结束时抛出,而不是在实际应该发生时抛出?
我的第二个问题是,当方法是事务性的时,抛出的异常是 DataViolationException
,而当它是非事务性的时,抛出的异常是 PSQLException
(使用 Postgres 数据库)。为什么会这样呢?
下面是代码:
@Transactional
public ResponseType methodA(UserObject userObject) {
//save call
jpaRepoObject.save(userObject);
//next call will fail due to relational constraints on database
jpaRepoObject.save(userObject); //should throw PSQLException/DataViolationException
return new ResponseType("success"); //Error thrown after this line.
}