Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment exécuter des requêtes SQL natives dans la même transaction Hibernate ?

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.