【问题标题】:getCurrentSession hibernate in web网络中的getCurrentSession休眠
【发布时间】:2011-04-17 09:54:45
【问题描述】:

我正在使用 hibernate 和 jsp/servlet 编写一个基于 Web 的应用程序。我已经阅读了sessionFactory.getCurrentSessionsessionFactory.openSession 方法。我知道它们之间的基本区别(使用getCurrentSession 您不必关闭连接,并且当您提交事务时,您的会话将自动关闭)。根据我的理解,我们应该选择 getCurrentSession 并通过 session-per-request 来完成。

让我们考虑以下场景:

  1. 方法 A 调用 getCurrentSession 并获得当前会话
  2. 在方法 A 中,使用步骤 1 中的会话启动事务
  3. 方法 A 调用方法 B,该方法也有 getCurrentSession 并启动事务
  4. 方法 B 提交其事务
  5. 控制权返回到方法 A,它也提交事务

现在我的问题是

  1. 在第 1 步和第 3 步中找到的会话会是同一个会话吗?
  2. 如果问题 1 的答案是肯定的,那么它将如何处理步骤 4 中的提交?理想情况下,它应该自行关闭会话并在第 5 步抛出异常。
  3. 如果问题 1 的答案是否定的,那么您如何处理这种情况?

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

    在第 1 步和第 3 步中找到的会话会是同一个会话吗?

    它们应该是相同的,这是getCurrentSession() 合同的一部分,只要工作单元尚未完成(即事务已提交),您就会将Session 绑定到线程或回滚)。 Java Persistence with Hibernate 是这样说的(第 481 页):

    在全局共享上调用getCurrentSession() 的所有数据访问代码 SessionFactory 可以访问相同的当前 Session — 如果在 相同的线程。当Transaction 被提交(或回滚)时,工作单元完成。如果您提交或回滚事务,Hibernate 还会刷新并关闭当前的Session 及其持久性上下文。这里的含义是在提交或回滚之后调用getCurrentSession() 会产生一个新的Session 和一个新的持久性上下文。

    您可能还想阅读 Session#beginTransaction() 的 javadoc 所说的内容。

    如果问题 1 的答案是肯定的,那么它将如何处理第 4 步中的提交。理想情况下,它应该自行关闭会话并在第 5 步给出错误。

    第 4 步应该没问题,Session 将被刷新,Transaction 将被提交,Session 将关闭。但我预计第 5 步会因 aTransactionException 失败(这是我的赌注)。但是让我引用Transaction的javadoc:

    事务与会话相关联,通常通过调用Session.beginTransaction() 来实例化。单个会话可能跨越多个事务,因为会话(应用程序和数据存储之间的对话)的概念比事务的概念粒度更粗。但是,我们的意图是在任何时候最多有一个与特定会话相关联的未提交事务

    如上所述,我们正在讨论一些不应该发生的事情(即设计问题)。

    【讨论】:

      【解决方案2】:

      对于您的方案,我没有答案,因为我不会那样实现它,因为它似乎是在自找麻烦。相反,我会在 C 中启动事务,其中 C 调用 A 和 B,并让 C 发出提交。骨骼:

      public void c(...) {
          try {
             transaction.begin();
             a();
             b();
             transaction.commit();
          catch (Exception e) {
             transaction.rollback();
          }
      }
      

      所以在这里,a()b() 没有提交或回滚 - 他们怎么知道整个业务任务已经完成?他们可以抛出异常或者返回一个布尔值来告诉调用者有什么问题需要回滚。

      【讨论】:

      • 谢谢托尼,我喜欢你提到的方式。
      • @Tony Ennis:加一,而且非常精简。
      猜你喜欢
      • 2011-12-24
      • 2015-11-12
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2016-04-19
      • 2011-01-30
      相关资源
      最近更新 更多