Sepertinya untuk konfigurasi Anda, transaksi yang dikelola kontainer digunakan secara default. Dalam hal ini Anda perlu menentukan cara sinkronisasi transaksi sehingga lapisan persistensi diberitahukan (dan dapat memperbarui cache tingkat ke-2 misalnya). Jadi, Anda perlu mendefinisikan manager_lookup_class
properti sebagai berikut:
// 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
Anda juga harus menandai metode bisnis yang mengakses lapisan data sebagai "transaksional". Untuk itu Anda perlu menandainya dengan @javax.ejb.TransactionAttribute(REQUIRED)
(lihat di sini
untuk informasi lebih lanjut tentang anotasi ini).
Anda juga memiliki opsi untuk beralih ke transaksi yang dikelola kacang. Anda dapat melakukannya dengan mengatakan:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Kemudian bean bertanggung jawab untuk memulai/mengakhiri transaksi:
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();
}
}