Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DAO方法中的事务回滚_Java_Spring_Hibernate_Transactions - Fatal编程技术网

Java DAO方法中的事务回滚

Java DAO方法中的事务回滚,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,从DAO方法中,我需要返回一个结果(即使发生异常)。我尝试这样做,在异常情况下它不工作(我有一个异常:在异常发生后不要刷新会话) 但是,当我取消注释//TransactionSpectSupport.currentTransactionStatus().setRollbackOnly()时 一切都如我所料。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下为什么吗?如果可能,我是否可以修改代码以使其工作?rollboor属性在带注释的方法引发指定异常时工作。在您的情况下,异常在方

从DAO方法中,我需要返回一个结果(即使发生异常)。我尝试这样做,在异常情况下它不工作(我有一个异常:
在异常发生后不要刷新会话

但是,当我取消注释
//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;
    }

}