Mysql
 sql >> Base de données >  >> RDS >> Mysql

hibernate, mysql, glassfish v3 et source de données JTA

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();
    }
}