我在我的项目中有下面的一段代码。在第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)
}
}
字符串
2条答案
按热度按时间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
并抛出它。字符串
然后把
UnmatchedDetailException
型
8hhllhi22#
使用默认的spring配置,只有未检查的运行时异常才会回滚。为了自定义此配置,rollbackFor被用作**@ translation**annotation中的属性。
对于前任,
@ transmitting(rollbackFor = { MyInvalidUserException.class,MyApplicationException.class })public void method()throws MyInvalidUserException,MyApplicationException { ... ... }