我正在尝试让我的 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();
}
- 通过注释掉异常,更新将提交。
- 通过取消注释(?)异常,它将回滚。
有什么办法可以实现这个目标吗?注意:事务部分是在服务中的事务注释下完成的。
最佳答案
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/