當在CMT(EJB3)中使用以下編程事務和會話語句並且Hibernate Core設置爲使用CMT時會發生什麼?
假定所需要的電流CMT事務,並使用默認@TransactionAttribute(REQUIRED)
Hibernate - 使用編程事務語法的CMT EJB
- 請問Hibernate事務加入當前CMT上
beginTransaction()
開始了嗎? - 將
commit()
嘗試立即提交hibernate事務或等到當前的CMT提交? - 在CMT中關閉會話時會發生什麼?
B.如果當前會話使用getCurrentSession()
綁定到CMT,行爲是否會取決於?
// A: openSession()
// B: getCurrentSession();
Session session = sessionFactory.openSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
// do some work
tx.commit();
}
catch (final RuntimeException e)
{
try
{
tx.rollback();
}
catch (final RuntimeException e)
{
// log error
}
throw e;
}
finally
{
session.close();
}
在我的應用程序目前我使用一個單一的數據庫,它能正常工作使用編程JDBC事務與Hibernate。現在,該應用程序還使用JMS-Queue進行郵件消息傳遞,並希望將其合併到全局CMT事務中。
編輯:
在我不是在所有的應用程序中使用的EntityManager,也想保留的代碼移植到非託管環境的時刻。
Hibernate配置hibernate.cfg.xml
啓用CMT:
休眠4.2.6和Glassfish 3.1.2
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.autocommit">false</property>
<property name="hibernate.connection.datasource">jdbc/datasource</property>
<property name="hibernate.current_session_context_class">jta</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
<property name="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.SunOneJtaPlatform</property>
SessionFactory的檢索
會話工廠是一個單EJB內建立。 剝離不必要的東西。
@Startup
@Singleton
public class SessionManager
{
private SessionFactory sessionFactory;
public SessionManager()
{
final Configuration configuration = new Configuration().configure();
this.sessionFactory = configuration.buildSessionFactory();
}
}
感謝您的回答。對我來說,'session.beginTransaction()'的描述並不清楚哪個事務是指(Hibernate或JTA)。 – djmj
http://docs.jboss.org/hibernate/annotations/3.5/api/org/hibernate/Transaction.html 似乎它既可以是純粹的jdbc之一,只要取決於TransactionFactory – Gab
一般來說是的,但不是在問題的設置中(除非你錯誤地配置了你的TransactionFactory)。 – Drunix