Hibernate Save,Hibernate Rollback

时间:2011-10-27 08:30:23

标签: java hibernate commit rollback

我正在努力让我的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. 通过取消注释(?)异常,它将回滚。
  3. 有任何方法可以实现这一目标吗?注意:事务部分是在事务注释下的服务中完成的。

2 个答案:

答案 0 :(得分:1)

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

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);
         }

}

当您在服务层中使用事务性注释时,如果您的服务方法成功返回,它将自动提交。如果在方法返回之前抛出任何异常,则事务将自动回滚。

答案 1 :(得分:0)

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

因此,如果要强制执行,则在提交后使用flush()。 如果您可以在会话/事务关闭后等待检查。