2

From my DAO method I need to return a result (even if exception occured). I try to do it in such a manner by it doesn't work in case of exception(I have an exception: 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;
    }

}

However when I uncomment //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); all works like I expect. I know that documentation don't recommend to use this approach, but annotation rollback doesn't work for me. Can you explain, please, why? Can I modify the code to get it work, if it is possible?

4

3 回答 3

4

rollbackFor如果带注释的方法抛出指定的异常,则属性有效。在您的情况下,异常在方法内部被捕获并且不会向上传播,因此rollbackFor没有效果。

于 2013-11-04T12:27:27.147 回答
4

只有当方法抛出异常时,Spring才会回滚。如果它在方法中被抛出并捕获,Spring 对异常一无所知,因此认为一切正常,因此不会回滚事务。

因此,要么保留对 setRollbackOnly 的调用,要么不使用布尔结果来指示操作成功或失败。如果保存不成功,应该抛出异常。

于 2013-11-04T12:29:24.257 回答
1

如果您确实需要返回一个值而不是向调用者抛出异常,那么您确实需要依赖 setRollbackOnly(),我认为这不是坏事,而是非常标准的方式。

此外,我认为抛出异常是一个更好的主意,因为您的调用者不知道出现“错误”时会出现什么问题。否则,您可能需要返回错误代码或错误消息或比“假”更有意义的内容。

于 2013-11-04T12:37:47.020 回答