Mysql
 sql >> Database >  >> RDS >> Mysql

Come eseguire query SQL native nella stessa transazione Hibernate?

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.