Es scheint, als würden für Ihre Konfiguration standardmäßig Container-verwaltete Transaktionen verwendet. In diesem Fall müssen Sie eine Art der Transaktionssynchronisierung definieren, damit die Persistenzschicht benachrichtigt wird (und beispielsweise den 2nd-Level-Cache aktualisieren kann). Sie müssen also definieren manager_lookup_class
Eigenschaft wie folgt:
// 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
Außerdem müssen Sie Geschäftsmethoden, die auf die Datenschicht zugreifen, als "transaktional" markieren. Dafür müssen Sie sie mit @javax.ejb.TransactionAttribute(REQUIRED)
markieren (siehe hier
). für weitere Informationen zu dieser Anmerkung).
Sie haben auch die Möglichkeit, zu Bean-verwalteten Transaktionen zu wechseln. Sie können dies tun, indem Sie sagen:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Dann ist die Bean für das Starten/Beenden der Transaktion verantwortlich:
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();
}
}