我有一个使用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
}
关于更好的方法的任何建议都是我正在寻找的。 p>
答案 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