4

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

在这里需要一些帮助。

4

1 回答 1

6

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

hibernate.current_session_context_class 的三种可能配置:

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

还:

  • 开箱即用的休眠支持“jta”和“thread”
  • “线程”上下文用于大多数独立的休眠应用程序或基于轻量级框架(如 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 设置为 managed 来扩展对话;这是否意味着现在我不能在我的方法中使用“jta(或 javax.jta.UserTransaction)”?

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

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

他们可以——事实上,这正是你在“jta”和“thread”上下文中要做的事情。

于 2011-10-28T18:08:16.727 回答