Похоже, что для вашей конфигурации транзакции, управляемые контейнером, используются по умолчанию.В этом случае вам нужно определить способ синхронизации транзакций, чтобы уровень персистенции был уведомлен (и, например, может обновить кэш 2-го уровня).Поэтому вам необходимо определить свойство manager_lookup_class
следующим образом:
// For GlassFish:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.SunONETransactionManagerLookup
// For WebSpere:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
// For JBoss:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
// For OpenEJB:
hibernate.transaction.manager_lookup_class=org.apache.openejb.hibernate.TransactionManagerLookup
Также вы должны пометить бизнес-методы, которые обращаются к уровню данных, как «транзакционные».Для этого вам нужно пометить их @javax.ejb.TransactionAttribute(REQUIRED)
(см. здесь для получения дополнительной информации об этой аннотации).
У вас также есть возможность переключаться на транзакции, управляемые компонентом.Вы можете сделать это, сказав:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Тогда компонент отвечает за запуск / завершение транзакции:
org.hibernate.Session session = ...;
org.hibernate.Transaction tx = null;
try {
tx = session.beginTransaction();
session.createQuery(...); // do some staff
tx.commit();
} catch (HibernateException e)
{
if (tx != null) {
tx.rollback();
}
}