Что происходит, когда используются следующие программные транзакции и идиома сеанса с CMT (EJB3) и Hibernate Core для использования CMT?
Принято считать, требуется текущая транзакция СМТ и начали использовать по умолчанию @TransactionAttribute(REQUIRED)
Hibernate - CMT EJB с использованием программной транзакции idiom
- Будет ли транзакция зимуют присоединиться к текущей CMT на
beginTransaction()
? - Будет ли
commit()
попытаться совершить транзакцию спящего режима немедленно или дождаться завершения текущего CMT? - Что происходит при закрытии сеанса в CMT?
B. Поведение зависит от того, связана ли текущая сессия с CMT с использованием getCurrentSession()
?
// 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 for Mail messaging и хочет объединить его в глобальную транзакцию CMT.
Edit:
В данный момент я не использую EntityManager в заявке на всех, и также хотел бы сохранить код переносимым в неуправляемых средах.
конфигурации Hibernate hibernate.cfg.xml
для включения СМТ:
Hibernate 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 поиска
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