Si vous n'utilisez pas les transactions gérées par conteneur alors vous devez également ajouter la politique de transaction :
@Stateful
@TransactionManagement(value=TransactionManagementType.CONTAINER)
@TransactionAttribute(value=REQUIRED)
Je n'ai constaté ce phénomène que dans deux situations :
- le
DataSource
s'exécute en mode auto-commit, donc chaque instruction est exécutée dans une transaction distincte - le
EntityManager
n'a pas été configuré avec@Transactional
, mais seules les requêtes peuvent alors être exécutées, car toute opération DML finirait par générer une exception de transaction requise.
Récapitulons que vous avez défini les propriétés Hibernate suivantes :
hibernate.current_session_context_class=JTA
transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
jta.UserTransaction=java:comp/UserTransaction
Où la propriété finale doit être définie avec votre clé de nommage JNDI Application Server UserTransaction.
Vous pouvez également utiliser :
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
ou une autre stratégie en fonction de votre serveur d'application Java EE actuel.