Il semble que pour votre configuration, les transactions gérées par le conteneur soient utilisées par défaut. Dans ce cas, vous devez définir un mode de synchronisation des transactions afin que la couche de persistance soit notifiée (et puisse mettre à jour le cache de 2ème niveau par exemple). Vous devez donc définir manager_lookup_class
propriété comme suit :
// 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
Vous devez également marquer les méthodes commerciales qui accèdent à la couche de données comme "transactionnelles". Pour cela, vous devez les marquer avec @javax.ejb.TransactionAttribute(REQUIRED)
(voir ici
pour plus d'informations sur cette annotation).
Vous avez également la possibilité de passer aux transactions gérées par le bean. Vous pouvez le faire en disant :
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Ensuite, le bean est responsable du démarrage/de la fin de la transaction :
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();
}
}