Mysql
 sql >> Database >  >> RDS >> Mysql

sorgente dati ibernazione, mysql, glassfish v3 e JTA

Sembra che per la tua configurazione le transazioni gestite dal contenitore vengano utilizzate per impostazione predefinita. In questo caso è necessario definire una modalità di sincronizzazione delle transazioni in modo che il livello di persistenza venga notificato (e possa aggiornare, ad esempio, la cache di 2° livello). Quindi è necessario definire manager_lookup_class proprietà come segue:

// 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

Inoltre devi contrassegnare i metodi aziendali che accedono al livello dati come "transazionali". Per questo devi contrassegnarli con @javax.ejb.TransactionAttribute(REQUIRED) (vedi qui per ulteriori informazioni su questa annotazione).

Hai anche un'opzione per passare alle transazioni gestite dal bean. Puoi farlo dicendo:

hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory

Quindi il bean è responsabile dell'inizio/fine della transazione:

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