【问题标题】:managed vs jta session scope in HibernateHibernate 中的托管与 jta 会话范围
【发布时间】:2011-08-21 20:30:22
【问题描述】:

我正在阅读“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?

在这里需要一些帮助。

【问题讨论】:

    标签: hibernate jta distributed-transactions


    【解决方案1】:

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

    hibernate.current_session_context_class 的三种可能配置:

    1. “jta”上下文 = 已经存在的 jta 事务
    2. “线程”上下文 = 当前线程(想想 ThreadLocal)
    3. “托管”上下文 = 自定义到您的域

    还有:

    • “jta”和“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”和“thread”上下文中要做的事情。

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2013-12-12
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多