繁体   English   中英

在Hibernate中管理vs jta会话范围

[英]managed vs jta session scope in Hibernate

我正在阅读“Java Persistence with Hibernate”一书并被困在第494页。 我们通过将hibernate.current_session_context_class to managed;设置hibernate.current_session_context_class to managed;扩展会话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中的语境会话”的问题。 它基本上是关于您希望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”和“线程”背景下所做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM