Có vẻ như đối với cấu hình của bạn, các giao dịch do vùng chứa quản lý được sử dụng theo mặc định. Trong trường hợp này, bạn cần phải xác định một cách đồng bộ hóa giao dịch để lớp bền vững được thông báo (và có thể cập nhật bộ đệm cấp 2 chẳng hạn). Vì vậy, bạn cần xác định manager_lookup_class
thuộc tính sau:
// 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
Ngoài ra, bạn phải đánh dấu các phương thức kinh doanh truy cập lớp dữ liệu là "giao dịch". Để làm được điều đó, bạn cần đánh dấu chúng bằng @javax.ejb.TransactionAttribute(REQUIRED)
(xem tại đây
để biết thêm thông tin về chú thích này).
Bạn cũng có một tùy chọn để chuyển sang các giao dịch do bean quản lý. Bạn có thể làm điều đó bằng cách nói:
hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
Sau đó, bean chịu trách nhiệm bắt đầu / kết thúc giao dịch:
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();
}
}