Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

hibernate, mysql, glassfish v3 e fonte de dados JTA


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