2010-03-04 11 views
5

Tengo un objeto de dominio que contiene los resultados de un cálculo basado en parámetros que son propiedades del mismo objeto de dominio. Me gustaría asegurarme de que el usuario cambie los parámetros de tiempo, los vuelva a calcular y se guarde correctamente en la base de datos.Modificar objeto en AfterInsert/AfterUpdate

Estoy tratando de hacer eso con afterInsert (para asegurarse de que el cálculo sea correcto en primer lugar), y afterUpdate.

Sin embargo, dado que mi cálculo está tratando de modificar el objeto en sí, no está funcionando, lanzando varias excepciones de hibernación.

Traté de poner el código afterUpdate en una transacción, pero eso no ayudó. Me temo que estoy entrando en problemas de dependencia circular aquí.

La excepción Me estoy haciendo en este momento es:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [esc.scorecard.PropertyScorecard#27] 

son los eventos GORM diseñados para casos de uso más simples? Estoy tentado de concluir que modificar el objeto que está en el medio de salvar no es el camino a seguir.

+0

¿cuál es tu solución a este problema. También estoy enfrentando este dilema. * .withNewSession * no parece funcionar para afterInsert. No puedo tirar el objeto ni guardarlo (bueno, puedo .save() pero parece que los cálculos que hice dentro de afterInsert no se conservan en la base de datos si solo uso .save()). ¡Gracias! De todos modos, lo que quiero hacer es persistir en un objeto User dentro de mi clase de dominio (por ejemplo, Message) que lo creó. Como audit-trail solo guarda una referencia larga solamente (por ejemplo, createdby), no puedo manipular eventualmente la clase de dominio Message y eventualmente hacer referencia a su attrib –

Respuesta

2

¿Hay alguna razón en contra del uso beforeInsertbeforeUpdate y en lugar de afterInsert y afterUpdate?

Si no es así, el cambio a los controladores de eventos before* debería solucionar su problema

+1

. Pensé que para el momento después de Insert fires, el objeto casi persiste, y tiene un id en ese punto, pero podría estar equivocado; todo el proceso de persistencia (con eventos) no parece estar bien documentado. –

+0

De hecho, si su cálculo está usando la propiedad 'id', podría ser un problema ubicar su código en * handlers. Y no sé qué evento se dispara cuando se genera la identificación. – fabien7474

3

¿Está utilizando 1.2.0+?

Si es así, puede usar .withNewSession en los cierres de eventos que se supone que evitan el caos de hibernación.

aplausos

Lee

+0

sí, estoy en 1.2.1. Intenté usar withNewSession, pero eso no ayudó, lo que generó extraños errores de hibernación. –

Cuestiones relacionadas