2011-01-13 5 views
5

durante la persistenza (aggiornamento) di un'entità che si chiama EntityManager.persist (entità) che passa l'entità completa. È possibile intercettare con @PreUpdate.Come identificare le modifiche alle proprietà dell'entità EJB in @PreUpdate?

Qualcuno ha una ricetta su come identificare quali proprietà sono state modificate in questo metodo di intercettazione? In qualche modo confrontando la vecchia e la nuova entità? Ancora meglio implementare un metodo generico invece di confrontare campo per campo per ogni classe.

Grazie per qualsiasi input!

Sven

+0

correlati: http://stackoverflow.com/questions/4586221/tracking-changes-to-db-fields-while-using-orm – javadude

risposta

3

Innanzitutto, persistono() è per nuovi oggetti (inserto) non aggiornare. Qualsiasi oggetto modificato nel contesto di persistenza verrà automaticamente aggiornato.

JPA non fornisce alcun modo standard per sapere cosa è cambiato. Pertanto, devi tenere traccia delle modifiche da solo o utilizzare un'API specifica del provider JPA.

In EclipseLink se si utilizza l'evento EclipseLink DescriptorEventListener PreUpdate invece dell'APP uno, si ottiene un ObjectChangeSet attaccato al DescriptorEvent che contiene le modifiche.

Un altro modo in JPA, se si utilizza la tessitura, consiste nel trasmettere l'oggetto a ChangeTracker e chiamare _persistence_getPropertyChangeListener() quindi getObjectChangeSet().

Se si utilizza TopLink Essentials, si applicano anche gli eventi descrittori, ma il tracciamento delle modifiche non è stato realizzato.

+0

C'è un modo per fare qualcosa di simile con Hibernate? – tazmaniax