簡體   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