【问题标题】:Hibernate Save, Hibernate Rollback休眠保存,休眠回滚
【发布时间】:2011-12-16 08:07:45
【问题描述】:

我正在尝试让我的 DAO 以这种方式工作:

    public void incrementNumber(long id) throws Exception{
        Session session = factory.openSession();
        Number n = (Number)session.load(Number.class, id);
        n.setNumber(n.getNumber() +5);
//      throw new IllegalArgumentException("BLAH");
        session.close();
    }
  1. 通过注释掉异常,更新将提交。
  2. 通过取消注释(?)异常,它将回滚。

有什么方法可以做到这一点?注意:事务部分是在服务中完成的,在事务注释下。

【问题讨论】:

  • make it in try...catch 类似:try {....do the hibernate stuff...} catch (illegalargumentexception e) {session.rollback();} finally {session.关闭}

标签: java hibernate commit rollback


【解决方案1】:

DAO主要负责持久化操作。它应该只提供CRUD和一些与特定实体相关的finder方法。

IMO,您的方法更像是业务操作而不是持久性操作。由于你有服务层,我建议你把这个方法移到它上面。

所以,您的 NumberDAO 可能如下所示:

public class NumberDAO {

     public Number loadById(long id){ }

}

你的 NumberService 可能看起来像这样:

public class NumberService{

        //Inject by DI containers , or setter / constructor
        NumberDAO numberDAO;

         public void incrementNumber(long id , int increaseAmount) throws Exception{

                Number n = (Number) numberDAO.loadById(id);

                if (XXXXXXXX) 
                    throws new IllegalArgumentException("BLAH BLAH BLAH BLAH");

                n.setNumber(n.getNumber() +increaseAmount);
         }

}

由于你在服务层使用事务注解,如果你的服务方法返回成功,它将自动提交。如果在方法返回之前抛出任何异常,事务将自动回滚。

【讨论】:

  • 谢谢,我试过了,但是,当它抛出异常时,它无法提交到数据库中......对此有什么建议吗?
  • 如果抛出异常,则表示事务应该回滚。如果要提交事务,则不应抛出异常。你到底想要什么?
  • 无异常时提交,异常时回滚。由于某种原因,即使没有抛出异常,更新也不会提交到数据库中。
  • 听起来是你的事务注释的问题。你确定它真的有效吗?此外,请确保 DAO 和服务都使用相同的休眠会话。
  • 嗯,这是函数的注释:'@Transactional(readOnly=false, rollbackFor=DataIntegrityViolationException.class)'
【解决方案2】:

commit 并不总是提交到数据库,它在会话缓存中设置必须提交,然后当您执行刷新(也取决于配置)时,提交将转到数据库,或者当会话/事务结束。

所以如果你想强制它在提交后使用flush()。 如果您可以在会话/事务关闭后等待检查。

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 2013-09-23
    • 2012-09-09
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2018-11-05
    相关资源
    最近更新 更多