[英]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.