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