Hibernate 在抛出异常时不会回滚

问题描述 投票:0回答:2

我的项目中有以下代码。第 4 行抛出异常,但我的产品详细信息仍被保存。我很难理解为什么即使在抛出异常之后它仍然保存产品详细信息 我还想了解第 4 行抛出的异常是已检查异常还是未检查异常?如果我抛出“抛出新异常(“详细信息不匹配”)”,我假设这是一个运行时异常?

class Product{
    @Transactional
        addDetails(){
            try{
            }
            catch (Exception e) {
               throw new Exception("Details dont match") //Line 4
            }
           productDAO.save(productDetails) 
           addAdditionalDetails(productDetails)
        }
       }

class ProductDAO {
   @Transactional
   public void save(Product productDetails){
       entitiyManager.merge(productDetails)
   }
}
java hibernate spring-jdbc spring-orm
2个回答
2
投票

我也想了解第 4 行抛出的异常是否是 检查或非检查异常?

答案:

java.lang.Exception
是受检查异常。

如果我抛出“抛出新异常(“详细信息不匹配”)”,那么它是 我假设运行时异常?

答案:不,这不是

RuntimeException
。 RuntimeException 是那些扩展了
java.lang.RuntimeException
或其
subclass

在spring中,当发生

Runtime
异常时,Transaction是Rollback。这意味着事务中抛出的任何异常都会被
extends RuntimeException
或其子类回滚。但就你而言,你抛出的
Exception
不是
RuntimeException
的一种。

解决方案:

我建议创建一个自定义异常,它扩展

RuntimeExction
并抛出它。

class UnmatchedDetailException extends RuntimeException{
    UnmatchedDetailException(String msg){
        super(msg);
    }
}

然后扔

UnmatchedDetailException

throw new UnmatchedDetailException("Deatils not matched");

0
投票

使用默认的 spring 配置,仅回滚未经检查的运行时异常。为了自定义此配置,rollbackFor用作@Transactional注释中的属性。

对于前任,

@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class }) public void method() 抛出 MyInvalidUserException,MyApplicationException { ... ... }

© www.soinside.com 2019 - 2024. All rights reserved.