Nel caso in cui non utilizzi transazioni gestite dal container quindi devi aggiungere anche la politica di transazione:
@Stateful
@TransactionManagement(value=TransactionManagementType.CONTAINER)
@TransactionAttribute(value=REQUIRED)
Ho visto questo fenomeno solo in due situazioni:
- il
DataSource
è in esecuzione in modalità di commit automatico, quindi ogni istruzione viene eseguita in una transazione separata - il
EntityManager
non è stato configurato con@Transactional
, ma in tal caso è possibile eseguire solo query poiché qualsiasi operazione DML finirebbe per generare un'eccezione richiesta per la transazione.
Ricapitoliamo che hai impostato le seguenti proprietà di ibernazione:
hibernate.current_session_context_class=JTA
transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
jta.UserTransaction=java:comp/UserTransaction
Dove la proprietà finale deve essere impostata con la chiave di denominazione JNDI di Application Server UserTransaction.
Potresti anche usare:
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
o qualche altra strategia in base al tuo attuale server di applicazioni Java EE.