Parece que para su configuración, las transacciones administradas por contenedor se usan de manera predeterminada. En este caso, debe definir una forma de sincronización de transacciones para que la capa de persistencia sea notificada (y pueda actualizar el caché de segundo nivel, por ejemplo). Por lo tanto, debe definir manager_lookup_class
propiedad de la siguiente manera:
// 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
También debe marcar los métodos comerciales que acceden a la capa de datos como "transaccionales". Para eso, debe marcarlos con @javax.ejb.TransactionAttribute(REQUIRED)
(consulte aquí
para obtener más información sobre esta anotación).
También tiene la opción de cambiar a transacciones gestionadas por beans. Puedes hacerlo diciendo:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Entonces el bean es responsable de iniciar/finalizar la transacción:
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();
}
}