簡體   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