在使用 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 开始事务的最佳位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

struts 2 Web应用程序中文件的相对路径

搭建一个简单的Struts2应用

第3章 Struts2框架--2完整的Struts2框架应用实例

[Java Web] Struts 2

Struts2入门2

如何在 Struts 2 应用程序中读取文本文件 [重复]