Wygląda na to, że w Twojej konfiguracji domyślnie używane są transakcje zarządzane przez kontener. W takim przypadku należy zdefiniować sposób synchronizacji transakcji, aby powiadomić warstwę trwałości (i na przykład zaktualizować pamięć podręczną drugiego poziomu). Musisz więc zdefiniować manager_lookup_class
właściwość w następujący sposób:
// 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
Musisz także oznaczyć metody biznesowe, które uzyskują dostęp do warstwy danych jako „transakcyjne”. W tym celu musisz je oznaczyć za pomocą @javax.ejb.TransactionAttribute(REQUIRED)
(patrz tutaj
aby uzyskać więcej informacji na temat tej adnotacji).
Masz również możliwość przejścia na transakcje zarządzane ziarnami. Możesz to zrobić, mówiąc:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Wtedy fasola odpowiada za rozpoczęcie/zakończenie transakcji:
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();
}
}