在使用 Struts 2 的疲惫 Web 应用程序中,哪里是开始使用 Hibernate 进行事务处理的最佳位置?

问题描述 投票:0回答:1

我得到了这个使用 Struts 2 和 Hibernate 的 Java Web 应用程序。最上层由 Struts 2 动作类组成。然后是我的业务逻辑类,它们负责应用程序的逻辑。最后还有一个 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 2 操作(控制器),应该提交或回滚。 Struts 2 操作可能会导致多个 DAO 调用,因此逻辑事务的某些部分可能会被提交,而其余部分会被回滚,这会损害数据完整性。

  2. 某些对象包含一些惰性集合。如果我们在 DAO 层中进行事务,我们需要在那里初始化这些集合,这不是一种有效的方法。因为我们不需要在每个操作中加载集合。因此,每当一个操作需要惰性集合时,我们需要在操作中打开一个会话并在其中加载惰性集合,这是一个肮脏的解决方案。

我认为最好避免在 DAO 层进行交易。如果我们将事务放在 Struts 2 操作中,它们将被视为原子事务,并且将保持数据一致性。另一方面,每当我们需要一个惰性集合时,我们可以在操作中初始化它。

为了保持代码简洁,我将保持DAO层与之前相同,但是DAO中的方法将从上层获取会话作为参数,并且它们不会处理事务和会话的提交.

这个策略听起来怎么样?这种方法有什么重大缺陷吗?您认为哪里是开始交易和管理会话的最佳位置?

java hibernate transactions struts2 dao
1个回答
1
投票

看来您的思考方向是正确的,但您应该记住,Hibernate 中的会话独立于事务。查看可应用于您的应用程序的交易策略配置

那么您应该阅读这篇文章,了解会话和事务如何协同工作。 最近您可能会遵循 Generic DAO 方法,不知道为什么,但这种技术非常流行。

最后,以上所有内容均已由 Struts2 jQuery Grid 实现。看看这个答案。

似乎以上所有内容都独立于 Spring,如果您喜欢 Spring 来管理事务那么您应该去这里

© www.soinside.com 2019 - 2024. All rights reserved.