Java DAO方法中的事务回滚
从DAO方法中,我需要返回一个结果(即使发生异常)。我尝试这样做,在异常情况下它不工作(我有一个异常:Java DAO方法中的事务回滚,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,从DAO方法中,我需要返回一个结果(即使发生异常)。我尝试这样做,在异常情况下它不工作(我有一个异常:在异常发生后不要刷新会话) 但是,当我取消注释//TransactionSpectSupport.currentTransactionStatus().setRollbackOnly()时 一切都如我所料。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下为什么吗?如果可能,我是否可以修改代码以使其工作?rollboor属性在带注释的方法引发指定异常时工作。在您的情况下,异常在方
在异常发生后不要刷新会话
)
但是,当我取消注释//TransactionSpectSupport.currentTransactionStatus().setRollbackOnly()时代码>
一切都如我所料。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下为什么吗?如果可能,我是否可以修改代码以使其工作?rollboor
属性在带注释的方法引发指定异常时工作。在您的情况下,异常在方法内部被捕获,并且不会向上传播,因此rollbackor
无效。Spring仅在该方法引发异常时才会回滚。如果它是在方法中抛出和捕获的,Spring对异常一无所知,因此认为一切正常,因此不会回滚事务
因此,要么保持对setRollbackOnly的调用,要么更倾向于不要使用布尔结果来指示操作成功或失败。如果保存未成功,则应抛出异常。如果确实需要返回值而不是向调用方抛出异常,则需要依赖setRollbackOnly(),我不认为这不坏,但这是非常标准的方法
此外,我认为抛出异常是一个更好的主意,因为当出现“false”时,您的调用方不知道哪里出了问题。否则,您可能需要返回错误代码、错误消息或比“false”更有意义的内容
@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;
}
}