Изглежда, че за вашата конфигурация транзакциите, управлявани от контейнери, се използват по подразбиране. В този случай трябва да дефинирате начин за синхронизиране на транзакциите, така че постоянният слой да бъде уведомен (и може да актуализира кеша от 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)
(вижте тук
за повече информация относно тази анотация).
Имате и опция да преминете към транзакции, управлявани от bean. Можете да го направите, като кажете:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Тогава bean е отговорен за стартиране/приключване на транзакцията:
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();
}
}