java - hibernate 保存、 hibernate 回滚

标签 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. 通过取消注释(?)异常,它将回滚。

有什么办法可以实现这个目标吗?注意:事务部分是在服务中的事务注释下完成的。

最佳答案

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

}

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

关于java - hibernate 保存、 hibernate 回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7913423/

相关文章:

java - 在 GWT 的标签上显示所需的指示器

java - javax.persistence @Column 上的长度字段是否定义了最大值?

java - IntelliJ IDEA 中的 Concurrency Diagram Menu 是什么意思?

hibernate - Grails( hibernate )条件查询

java - 如何将简单的英语转化为组合的逻辑条件?

java - 如果使用双引号,则无法使用 Hibernate 插入行

java - 如何解决这个异常org.hibernate.exception.JDBCConnectionException

git - 请参阅 github 中的 "real"提交日期/时间(小时/天)

svn 不提交 .o 文件,但为什么呢?

java - 如何使用java代码进行CVS提交