Hibernate中的管理和JTA会话范围有何区别?

4
我正在阅读《Java Persistence with Hibernate》这本书,在第494页遇到了困难。我们通过设置hibernate.current_session_context_class为managed;来扩展会话,这是否意味着我现在不能在我的方法中使用'jta(或javax.jta.UserTransaction)'了? 当我查看第494页的拦截器代码时,这种假设变得更加强烈。在拦截器中,我们调用'session.beginTransaction',这意味着我们使用Hibernate事务API来控制事务。 这是否意味着我的实体不能使用UserTransaction.begin()/commit()来控制事务? 我之所以这样说,是因为在本书的某个地方,我甚至读到过当您使用UserTransaction来控制事务边界时,不应该使用Hibernate事务API的内容。 需要一些帮助。
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6
首先,我认为你提到的那本书很棒,但现在有点过时了。但是我可以肯定地猜测,你的问题基于所谓的“Hibernate中的上下文会话”。它基本上是关于你希望Hibernate管理事务范围的上下文。这个上下文驱动sessionFactory.getCurrentSession()方法的机制。 hibernate.current_session_context_class有三个可能的配置: 1. “jta”上下文=已存在的JTA事务 2. “thread”上下文=当前线程(考虑ThreadLocal) 3. “managed”上下文=自定义到你的域 此外: - “jta”和“thread”由Hibernate支持。 - “thread”上下文在大多数独立的Hibernate应用程序或基于轻量级框架(如Spring)的应用程序中使用。 - “jta”在Java EE环境中使用。 现在请查看这两个优秀的链接:

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

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

第一个问题是关于更新的清晰信息,后一个问题是为了查看“托管”上下文的自定义实现。这将澄清很多事情。无论如何: 我正在阅读《使用Hibernate进行Java持久化》一书,并卡在第494页。我们通过将hibernate.current_session_context_class设置为managed来扩展对话;这是否意味着现在我不能在我的方法中使用'jta(或javax.jta.UserTransaction)'? 你可以 - 因为它是托管上下文,它取决于您的自定义实现。 这是否意味着我的实体不能使用UserTransaction.begin()/commit()来控制事务? 他们可以 - 实际上这正是您在“jta”和“thread”上下文中要做的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,