2010-03-04 13 views
5

Ho un codice di sospensione che esegue un inserimento nel database e al termine di tale inserimento viene attivato un PostInsertEventListener personalizzato. (Essenzialmente un trigger per garantire che gli altri record vengano aggiornati in modo appropriato)Hibernate PostInsertEventListeners: utilizzare la stessa transazione inserita?

Quello che devo fare è fare in modo che il codice all'interno di EventListener usi la stessa transazione dell'inserto originale, in modo che se l'inserimento non viene eseguito correttamente, EventListener non sparerà.

Ho sentito che è possibile utilizzare i metodi transaction.registerSyncronization() di Hibernate per fare questo, ma non ci sono esempi di utilizzo da nessuna parte che posso trovare.

Qualsiasi aiuto è apprezzato.

risposta

3

Non penso che sia possibile.

Se ho capito, si desidera eseguire qualche codice solo se la transazione è stata completata correttamente (è stato eseguito). Tuttavia, se la transazione è impegnata, non puoi fare qualcos'altro nella stessa transazione da quando è finita.

Ciò che si potrebbe fare è tuttavia utilizzare un PreInsertEventListener che viene chiamato all'interno della transazione (prima del commit). Il listener di eventi genera un evento se la transazione fallisce (dal momento che non sappiamo fino al commit se la transazione avrà esito positivo), ma tutto ciò che modifichi nel listener non verrà memorizzato nel database se la transazione fallisce. Controlla https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/EventListeners.html per l'elenco degli ascoltatori.

Un avvertimento però. Non dovresti fare troppa modifica dei dati in un listener. Soprattutto, non dovresti innescare alcun carico pigro delle raccolte.

Problemi correlati