在Hibernate中管理vs jta会话范围

Vic*_*cky 4 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吗?

这里需要一些帮助.

hap*_*s10 5

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

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

  1. "jta"context =已经存在的jta事务
  2. "thread"context =当前线程(想想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设置为managed来扩展会话; 这是否意味着我现在不能在我的方法中使用'jta(或javax.jta.UserTransaction)'?

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

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

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