在hibernate中回滚的最佳方法

时间:2016-01-16 17:31:16

标签: hibernate rollback

我有一个使用struts2 + hibernate构建的Web应用程序。有几个Entity bean类代表我的项目的数据库表。我有一种情况,其中一条记录依赖于另一条记录,如下面的代码:

  Dao.getIncomeInstance.save(User user,Income income);
  Dao.getBudgetInstance.update(Budget budget,Income income);

每个方法都有session.getTransaction().commit();,这意味着我正在提交交易。但无论预算中的错误如何,收入记录都会被保存,我假设这不是一种正确的方法。我有一个方法是创建一个新方法,它接受事务对象的另一个参数到Budget方法,如Dao.getBudgetInstance.update(Transaction trans,Budget budget,Income income);,这样如果有任何问题/错误我可以回滚,但不喜欢它因为我最终会创建多个具有相同名称的方法(大约10个方法与更新同名,接受不同的参数)。

我是hibernate的新手。有人可以向我建议一种方法,通过这种方法我可以创建回滚点并完成所有操作,并且可以在我想要的时候进行回滚(有些事情如下所示。这些只是假设以确定我的想法):

  Rollback roll=null;
  try{
  roll=session.transaction.createRollBack();
  Dao.getIncomeInstance.save(User user,Income income);
  Dao.getBudgetInstance.update(Budget budget,Income income);
  }
  catch(RuntimeException exe)
  {
   // do the rollback with roll reference
  }

关于更好的方法的任何建议都是我正在寻找的。

1 个答案:

答案 0 :(得分:2)

事务不应该在DAO方法中划分,而是在调用所有DAO的业务服务方法中划分,因此单个事务包含对数据库的所有相关更改,以便提交所有或不提交所有DAO。

在现代企业代码中,事务通常由您碰巧使用的依赖注入容器(Spring,CDI,EJB,...)声明性地划分。例如,使用Spring,只需简单地注释业务服务以使其成为事务性的:

@Transactional
public void whatever(User user, Budget budget, Income income) {
    incomeDao.save(user, income);
    budgetDao.update(budget, income);
}

进一步阅读:Spring reference manual