2010-03-04 18 views
5

Tengo un código de hibernación que realiza una inserción en la base de datos, y al completar esa inserción se activa un PostInsertEventListener personalizado. (Esencialmente un disparador para asegurar que otros registros se actualicen apropiadamente)Hibernate PostInsertEventListeners -Utilizar la misma transacción que insertar?

Lo que necesito hacer es hacer que el código dentro del EventListener use la misma transacción que el original, de modo que si el inserto no se confirma correctamente, el EventListener no disparará

He oído que puede utilizar los métodos javax.transaction.Syncronization e Hibernate transaction.registerSyncronization() para hacer esto, pero no hay ejemplos de uso en ningún lugar que pueda encontrar.

Cualquier ayuda es apreciada.

Respuesta

3

No creo que esto sea posible.

Si lo entiendo, desea ejecutar algunos códigos solo si la transacción se completó correctamente (se confirmó). Sin embargo, si la transacción está comprometida, no puede hacer otra cosa en la misma transacción ya que ha finalizado.

Lo que podría hacer sin embargo es usar un PreInsertEventListener que se llama dentro de la transacción (antes de la confirmación). El oyente del evento activará el evento si la transacción falla (ya que no sabemos hasta la confirmación si la transacción tendrá éxito) pero cualquier cosa que modifique en el oyente no se almacenará en la base de datos si la transacción falla. Compruebe https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/EventListeners.html para la lista de oyentes.

Una advertencia sin embargo. No debe hacer demasiada modificación de datos en un oyente. Especialmente, no debe activar ninguna carga diferida de colecciones.

Cuestiones relacionadas