java - 当我在下一行抛出异常时@Transactional 不起作用

标签 java spring database hibernate spring-boot

我不明白以下行为:

我有一个方法:

@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/

相关文章:

php - MySQL COUNT 与 GROUP 和 JOIN

java - 将 ArrayList<Integer> 转换为 int[] 在 Java 中不起作用

java - 如何在运行时从java设置类路径

java - AnnotationConfigApplicationContext 尚未刷新 - 怎么了?

database - 存储过程逆向工程

Java ArrayList 正在发挥作用

java - 如何向 JPanel 添加和删除标签?

Java 对象范围,从方法引用

java - DefaultCookieSerializer.setJvmRoute 不工作

java - 无法注入(inject)Bean