繁体   English   中英

发生运行时异常时,Hibernate不会回滚

[英]Hibernate does not rollback in case of a runtime exception thrown

我的项目中包含以下代码。 第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)
   }
}

我还试图了解第4行抛出的异常是已检查还是未检查的异常?

答: java.lang.Exception是一个检查的异常。

如果我抛出“抛出新异常(“细节不匹配”)),这是我假设的运行时异常?

答:不,它不是RuntimeException RuntimeException是那些扩展java.lang.RuntimeException或其subclass

在春季,发生Runtime异常时,“事务是回滚”。 这意味着在extends RuntimeException或其子类的事务中抛出的任何异常都将回滚它。 但是在您的情况下,您将抛出不是RuntimeException类型的Exception

解:

我建议创建一个Custom异常,该异常将扩展RuntimeExction并将其引发。

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

然后抛出UnmatchedDetailException

throw new UnmatchedDetailException("Deatils not matched");

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

例如,

@Transactional(rollbackFor = {MyInvalidUserException.class,MyApplicationException.class})公共无效方法()抛出MyInvalidUserException,MyApplicationException {... ...}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM