sql >> Base de Datos >  >> RDS >> Mysql

fuente de datos hibernate, mysql, glassfish v3 y JTA

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