我有一个使用Struts和Hibernate的java web应用程序。最上层包含Struts动作类。然后是我的业务逻辑类负责应用程序的逻辑。最后有一个DAO层(称为数据库桥),负责与数据库通信。
目前我打开会话并在DAO层执行交易,如下所示:
public static void saveObject(Object object) throws Exception {
Session session = null;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(object);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
throw e;
} finally {
if (session != null)
if (session.isOpen())
session.getTransaction().rollback();
}
}
这种方法似乎存在一些问题:
1)逻辑上我的事务是我的Struts操作(控制器),应该提交或回滚。 Struts操作可能会导致多个DAO调用,因此逻辑事务的某些部分可能会被提交,而其余部分可能会被回滚,这会损害数据的完整性。
2)有些对象包含一些惰性集合。如果我们在DAO层执行事务,我们需要在那里初始化那些不是一种有效方式的集合。因为我们不需要在每个动作中加载集合。因此,每当一个动作需要一个惰性集合时,我们需要在动作中打开一个会话并在那里加载一个懒惰的集合,这是一个肮脏的解决方案。
我认为最好避免在DAO层中进行交易。如果我们将事务放在Struts操作中,它们将被视为原子事务,并且将保持数据一致性。另一方面,只要我们需要一个惰性集合,我们就可以在动作中初始化它。
为了保持代码清洁,我将保持DAO层与以前相同,但DAO中的方法将会话作为上层的参数,它们不会处理事务的承诺和会议。
这个策略听起来如何?这种方法有什么重大缺陷吗?你认为哪里是开展交易和管理会议的最佳场所?
答案 0 :(得分:1)
您似乎正在考虑正确的方向,但您应该记住,Hibernate中的会话独立于事务。查看可能适用于您的应用程序的transaction strategy configuration。
然后你应该阅读这篇文章sessions and transactions如何协同工作。 最近你可能会遵循Generic DAO方法,不知道为什么,但这种技术很受欢迎。
最后所有这些都已经由Struts2 jQuery Grid实现了。看看this回答。
似乎所有上述内容都独立于Spring,如果你喜欢Spring来管理事务,那么你应该去here。