在Hibernate中管理vs jta会话范围

时间:2011-05-09 16:57:02

标签: hibernate jta distributed-transactions

我正在阅读'Java Persistence with Hibernate'一书,并被困在第494页。我们通过设置hibernate.current_session_context_class to managed;来扩展对话,这意味着现在我不能在我的方法中使用'jta (or javax.jta.UserTransaction)'吗?

当我查看第494页的拦截器代码时,这种假设越来越强烈。在拦截器中,我们调用'session.beginTransaction'表示我们正在使用Hibernate Transaction API来控制事务。

这是否意味着,我的实体不能使用UserTransaction.begin()/ commit()来控制交易?

我告诉这个,因为在本书的某处我甚至读过,当你使用UserTransaction来控制事务边界时,你不应该使用Hibernate Transaction API吗?

需要一些帮助。

1 个答案:

答案 0 :(得分:5)

首先,恕我直言,你提到的这本书很棒,但现在有点过时了。但我可以肯定地猜测,你的问题是基于被称为“Hibernate中的语境会话”的问题。它基本上是关于您希望Hibernate管理事务范围的上下文。此上下文驱动sessionFactory.getCurrentSession()方法的机制。

hibernate.current_session_context_class的三种可能的配置:

  1. “jta”context =已经存在的jta交易
  2. “thread”context =当前线程(想想ThreadLocal)
  3. “托管”上下文=自定义域名
  4. 此外:

    • “jta”和“thread”由hibernate开箱即用支持
    • “thread”上下文用于大多数独立的hibernate应用程序或基于轻量级框架的应用程序,如spring
    • “jta”用于Java EE环境

    现在看看这两个很棒的链接:

    http://community.jboss.org/wiki/SessionsAndTransactions

    http://community.jboss.org/wiki/OpenSessionInView

    第一个用于更新明确信息,后者用于查看“托管”上下文的自定义实现。这将清除很多事情。反正:

      

    我正在阅读'Java Persistence with Hibernate'这本书   卡在第494页。我们通过设置来扩展对话   hibernate.current_session_context_class来管理;这是否意味着现在   我不能在我的方法中使用'jta(或javax.jta.UserTransaction)'吗?

    您可以 - 因为它是托管上下文,它将取决于您的自定义实现。

      

    这是否意味着,我的实体无法使用   UserTransaction.begin()/ commit()来控制事务?

    他们可以 - 实际上这正是你在“jta”和“线程”背景下所做的事情。