2010-03-04 9 views
5

Ho un oggetto dominio che contiene i risultati di un calcolo basato su parametri che sono proprietà dello stesso oggetto dominio. Mi piacerebbe essere sicuro che qualsiasi parametro temporale venga modificato dall'utente, viene ricalcolato e salvato correttamente nel database.Modifica oggetto in AfterInsert/AfterUpdate

Sto provando a farlo con afterInsert (per assicurarsi che il calcolo sia corretto in primo luogo) e dopoAggiornamento.

Tuttavia, poiché il mio calcolo sta tentando di modificare l'oggetto stesso, non funziona, generando varie eccezioni di sospensione.

Ho provato a inserire il codice afterUpdate in una transazione, ma questo non ha aiutato. Ho paura di entrare in una questione di dipendenza circolare qui.

L'eccezione che sto ottenendo in questo momento è:

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

sono gli eventi Gorm progettati per casi di utilizzo più semplici? Sono tentato di concludere che modificare l'oggetto nel mezzo del salvataggio non è la strada da percorrere.

+0

qual è la tua soluzione a questo problema. Anch'io sto affrontando questo dilemma. * .withNewSession * non sembra funzionare per afterInsert. Non riesco a svuotare l'oggetto né a salvarlo (beh, posso .save() ma sembra che i calcoli che ho fatto all'interno di afterInsert non siano persistenti nel database se uso semplicemente .save()). Grazie! In ogni caso, quello che voglio fare è mantenere un oggetto User all'interno della mia classe di dominio (ad es., Message) che lo ha creato. Poiché audit-trail salva solo un riferimento Long (ad es., Creato da), non posso alla fine manipolare la classe del dominio Message e eventualmente fare riferimento al suo attrib –

risposta

2

C'è qualche ragione contro l'uso beforeInsert e beforeUpdate invece di afterInsert e afterUpdate?

In caso contrario, il passaggio ai gestori di eventi before* dovrebbe risolvere il problema

+1

Ho pensato per il momento in cuiInsert viene attivato, l'oggetto è quasi persistente e ha un id da quel punto, ma potrei sbagliarmi - l'intero processo di persistenza (con gli eventi) non sembra essere ben documentato. –

+0

Infatti, se il tuo calcolo utilizza la proprietà 'id', potrebbe essere un problema trovare il tuo codice prima dei * handler. E non so quale evento viene generato quando viene generato id. – fabien7474

3

Si sta utilizzando 1.2.0+?

Se lo è, è possibile utilizzare. WithNewSession nelle chiusure di eventi che dovrebbero evitare il caos di ibernazione.

applausi

Lee

+0

sì, sono su 1.2.1. Ho provato a usare withNewSession, ma questo non ha aiutato, con conseguenti strani errori di ibernazione. –

Problemi correlati