Parece que para sua configuração, as transações gerenciadas por contêiner são usadas por padrão. Neste caso você precisa definir uma forma de sincronização de transações para que a camada de persistência seja notificada (e possa atualizar o cache de 2º nível por exemplo). Então você precisa definir
manager_lookup_class
propriedade da seguinte forma:// 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
Além disso, você deve marcar os métodos de negócios que acessam a camada de dados como "transacionais". Para isso, você precisa marcá-los com
@javax.ejb.TransactionAttribute(REQUIRED)
(consulte aqui
para obter mais informações sobre esta anotação). Você também tem a opção de alternar para transações gerenciadas por bean. Você pode fazer isso dizendo:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Então o bean é responsável por iniciar/terminar a transação:
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();
}
}