从我的DAO方法我需要返回一个结果(即使发生了异常)。我尝试以这种方式执行它,因为它在异常的情况下不起作用(我有例外:don't flush the Session after an exception occurs
)。
@Repository
@Transactional(rollbackFor=HibernateException.class)
public class UserDAO {
@Override
public boolean save(Proxy proxy) {
try{
sessionFactory.getCurrentSession().save(proxy);
}
catch(HibernateException e){
//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return false;
}
return true;
}
}
但是当我取消注释//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
时
一切都像我期待的那样。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下,为什么?如果可能,我可以修改代码以使其正常工作吗?
答案 0 :(得分:4)
rollbackFor
属性有效。在你的情况下,异常被捕获在方法内部并且不会传播,因此rollbackFor
没有效果。
答案 1 :(得分:4)
只有在方法抛出异常时,Spring才会回滚。如果它被抛出并被捕获到方法内部,那么Spring对该异常一无所知,因此认为一切都很顺利,因此不会回滚事务。
因此,要么保持对setRollbackOnly的调用,要么更优先不要使用布尔结果来指示操作成功或失败。如果保存不成功,则会抛出异常 。
答案 2 :(得分:1)
如果你确实需要返回一个值而不是向你的调用者抛出异常,你需要依赖setRollbackOnly(),我认为这不是很糟糕,但很标准。
此外,我认为抛出异常是一个更好的主意,因为当有“假”时,你的来电者不会知道出了什么问题。否则,您可能需要返回错误代码或错误消息或更有意义的错误'。