Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hibernate, MySQL, Glassfish v3 und JTA-Datenquelle

Es scheint, als würden für Ihre Konfiguration standardmäßig Container-verwaltete Transaktionen verwendet. In diesem Fall müssen Sie eine Art der Transaktionssynchronisierung definieren, damit die Persistenzschicht benachrichtigt wird (und beispielsweise den 2nd-Level-Cache aktualisieren kann). Sie müssen also definieren manager_lookup_class Eigenschaft wie folgt:

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

Außerdem müssen Sie Geschäftsmethoden, die auf die Datenschicht zugreifen, als "transaktional" markieren. Dafür müssen Sie sie mit @javax.ejb.TransactionAttribute(REQUIRED) markieren (siehe hier ). für weitere Informationen zu dieser Anmerkung).

Sie haben auch die Möglichkeit, zu Bean-verwalteten Transaktionen zu wechseln. Sie können dies tun, indem Sie sagen:

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

Dann ist die Bean für das Starten/Beenden der Transaktion verantwortlich:

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