Trong trường hợp bạn không sử dụng giao dịch được quản lý vùng chứa thì bạn cũng cần thêm chính sách giao dịch:
@Stateful
@TransactionManagement(value=TransactionManagementType.CONTAINER)
@TransactionAttribute(value=REQUIRED)
Tôi chỉ thấy hiện tượng này trong hai tình huống:
-
DataSource
đang chạy ở chế độ tự động cam kết, do đó mỗi câu lệnh được thực hiện trong một giao dịch riêng biệt -
EntityManager
không được định cấu hình bằng@Transactional
, nhưng sau đó chỉ có thể chạy các truy vấn vì bất kỳ hoạt động DML nào cuối cùng cũng đưa ra một ngoại lệ bắt buộc giao dịch.
Hãy tóm tắt lại bạn đã đặt các thuộc tính Hibernate sau:
hibernate.current_session_context_class=JTA
transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
jta.UserTransaction=java:comp/UserTransaction
Nơi thuộc tính cuối cùng phải được đặt bằng khóa đặt tên UserTransaction JNDI của Máy chủ Ứng dụng của bạn.
Bạn cũng có thể sử dụng:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
hoặc một số chiến lược khác theo Máy chủ ứng dụng Java EE hiện tại của bạn.