java - DAO方法中的事务回滚

标签 java spring hibernate transactions

我需要从我的 DAO 方法返回一个结果(即使发生异常)。我尝试以这种方式进行操作,因为它在异常情况下不起作用(我有一个异常(exception):发生异常后不要刷新 session )。

@Repository
@Transactional(rollbackFor=HibernateException.class)
public class UserDAO {

    @Override
    public boolean save(Proxy proxy) {
        try{
            sessionFactory.getCurrentSession().save(proxy);
        }
        catch(HibernateException e){
            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }
        return true;
    }

}

然而,当我取消注释 //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 一切都像我期望的那样工作。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下吗,为什么?如果可能的话,我可以修改代码以使其工作吗?

最佳答案

只有方法抛出异常,Spring才会回滚。如果它被抛出并捕获在方法内部,Spring 对异常一无所知,因此认为一切正常,因此不会回滚事务。

因此,要么继续调用 setRollbackOnly,要么最好不要使用 boolean 结果来指示操作成功或失败。如果保存不成功,则应该抛出异常。

关于java - DAO方法中的事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19767594/

相关文章:

用于支持 AWS API Gateway 上的 API KEY 的 Spring Boot Swagger 注释

java - 在使用 @SpringBootTest 运行的测试中定义 tomcat 属性

spring - Hibernate Session 的 get() 函数检索问号而不是希腊字符

java - 添加滚动java时文本区域不可见

java - 如何使用 JOSS 在 OpenStack 容器上写入文件

java - 如何在 onClickListener 中获取点击位置?

java - Linux下运行tess4j(tessreact java包装器)

java - 错误 java.lang.IllegalArgumentException : Name for argument type [java. lang.String]

java - JPQL 查询中的静态工厂方法而不是构造函数

java - Hibernate:使用子查询时出错