在使用 Struts 2 的疲惫的 Web 应用程序中使用 Hibernate 开始事务的最佳位置在哪里?
Posted
技术标签:
【中文标题】在使用 Struts 2 的疲惫的 Web 应用程序中使用 Hibernate 开始事务的最佳位置在哪里?【英文标题】:Where is the best place to begin transaction using Hibernate in a tired web application with Struts 2? 【发布时间】:2013-11-30 00:41:50 【问题描述】:我得到了这个使用 Struts 2 和 Hibernate 的 Java Web 应用程序。在最上层包括 Struts 2 动作类。然后是我的业务逻辑类,它们负责应用程序的逻辑。最后还有一个 DAO 层(称为 Database Bridge),负责与数据库进行通信。
目前我打开会话并在 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();
这种方法似乎存在一些问题:
从逻辑上讲,我的事务是我的 Struts 2 操作(控制器),应该提交或回滚。一个 Struts 2 操作可能会导致多个 DAO 调用,因此逻辑事务的某些部分可能会被提交,而其余部分可能会被回滚,这会损害数据完整性。
一些对象包含一些惰性集合。如果我们在 DAO 层进行事务,我们需要在那里初始化那些集合,这不是一种有效的方法。因为我们不需要在每个动作中加载集合。所以每当一个动作需要一个惰性集合时,我们需要在动作中打开一个会话并在其中加载惰性集合,这是一个肮脏的解决方案。
我认为最好避免在 DAO 层进行事务。如果我们将事务放在 Struts 2 动作中,它们将被视为原子事务,并且将保持数据一致性。另一方面,当我们需要一个惰性集合时,我们可以在操作中对其进行初始化。
为了保持代码干净,我会保持DAO层和之前一样,但是DAO中的方法会从上层获取session作为参数,不会处理事务的commitment和会议。
这个策略听起来如何?这种方法有什么重大缺陷吗?您认为在哪里开始交易和管理会话的最佳位置?
【问题讨论】:
您应该真正了解依赖注入和声明式事务,而不是自己以编程方式管理它们。使用 Spring (struts.apache.org/release/2.2.x/docs/spring-and-struts-2.html),在服务层以声明方式划分事务,并可选地使用 Spring open session in view filter 来避免延迟加载问题。您的代码将大大减少,更具可读性和可测试性,并且更加可靠。 如果应用疲倦,可能需要REST ^^ 【参考方案1】:您的想法似乎是正确的,但您应该记住,Hibernate 中的会话独立于事务。查看可能适用于您的应用程序的transaction strategy configuration。
那么您应该阅读这篇文章 sessions and transactions 如何协同工作。 最近你可能会遵循Generic DAO 方法,不知道为什么,但这种技术非常流行。
最后,以上所有内容都已由 Struts2 jQuery Grid 实现。看this的回答。
似乎以上所有内容都独立于Spring,如果您喜欢Spring来管理事务,那么您应该去here。
【讨论】:
community.jboss.org/wiki/SessionsAndTransactions 得到了我的答案,我现在所做的是使用每个请求模式的会话。以上是关于在使用 Struts 2 的疲惫的 Web 应用程序中使用 Hibernate 开始事务的最佳位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章