在抛出异常的情况下,Hibernate不会回滚

chy5wohz  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(143)

我在我的项目中有下面的一段代码。在第4行抛出了一个异常,但我的产品详细信息仍被保存。我很难理解为什么它在抛出异常后仍保存产品详细信息**我也想知道在第4行抛出的异常是检查异常还是未检查异常?如果我抛出“throw new Exception(“Details don't match”)”,那么我假设它是一个异常。

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)
   }
}

字符串

rjjhvcjd

rjjhvcjd1#

我还试图理解在第4行抛出的异常是检查异常还是未检查异常?
答:java.lang.Exception是一个检查异常。
如果我抛出“throw new Exception(“Details don't match”)”,我假设这是一个异常。
答:不,它不是RuntimeException。RuntimeException是扩展java.lang.RuntimeException或其subclass的异常。
在spring by Transaction中,当Runtime异常发生时是回滚。这意味着在extends RuntimeException或其子类中抛出的任何异常都会回滚它。但在您的情况下,您抛出的Exception不是RuntimeException的类型。
解决方法:
我建议创建一个自定义异常,扩展RuntimeExction并抛出它。

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

字符串
然后把UnmatchedDetailException

throw new UnmatchedDetailException("Deatils not matched");

8hhllhi2

8hhllhi22#

使用默认的spring配置,只有未检查的运行时异常才会回滚。为了自定义此配置,rollbackFor被用作**@ translation**annotation中的属性。
对于前任,
@ transmitting(rollbackFor = { MyInvalidUserException.class,MyApplicationException.class })public void method()throws MyInvalidUserException,MyApplicationException { ... ... }

相关问题