我不明白以下行为:
我有一个方法:
@Transactional
public void processRejection(final Path path) {
try {
//some code here
} catch (final Exception e) {
this.handleException(e));
}
}
它调用下面的代码来保存
数据库中尚不存在的实体:
void handleException(final Throwable e) {
this.filesMonitoringJpaManager.save(someEntityHere);
throw new Exception(...)
}
现在奇怪的是,当我评论时抛出新的异常(...)
,保存
有效,但是当我取消注释 抛出新的异常(...)
然后保存
不起作用,我不知道为什么?
JPA 或 Hibernate 有什么奇怪的行为?是不是我不明白Java异常机制?
最佳答案
@Transactional
的目的是在出现问题(抛出异常)时回滚。您正在 catch
block 中保存实体,但重新抛出异常,导致事务方法回滚。
但是你可以指定一个异常,这不会导致回滚:
@Transactional(noRollbackFor = {MyException.class})
public void processRejection(final Path path) {
try {
//somecode here whatever
} catch (final Exception e) {
this.handleException(e));
}
}
void handleException(final Throwable e) {
this.filesMonitoringJpaManager.save(someEntityHere);
throw new MyException(...)
}
这适用于org.springframework.transaction.annotation.Transactional
。如果您使用的是 javax.transaction.Transactional
,那么您可以通过使用 dontRollbackOn
属性来实现。
关于java - 当我在下一行抛出异常时@Transactional 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60995945/