2011-01-13 5 views
5

al persistir (actualizar) una entidad a la que llamaría EntityManager.persist (entidad) pasando la entidad completa. Es posible interceptar con @PreUpdate.¿Cómo identificar los cambios en la propiedad de la entidad EJB en @PreUpdate?

¿Alguien tiene una receta de cómo identificar qué propiedades han cambiado en este método interceptor? ¿De alguna manera comparando la vieja y la nueva entidad? Aún mejor para implementar un método genérico en lugar de comparar campo por campo para cada clase.

¡Gracias por cualquier entrada!

Sven

+0

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

Respuesta

3

En primer lugar, persisten() es para los nuevos objetos (inserto) no actualizar. Cualquier objeto modificado en el contexto de persistencia se actualizará automáticamente.

JPA no proporciona ninguna forma estándar para saber qué cambió. Por lo tanto, debe realizar un seguimiento de los cambios usted mismo o utilizar una API específica del proveedor de JPA.

En EclipseLink si usa el evento EclipseLink DescriptorEventListener preUpdate en lugar del JPA uno, obtiene un ObjectChangeSet adjunto al DescriptorEvent que contiene los cambios.

Otra forma en JPA, si está utilizando el tejido, es enviar su objeto a ChangeTracker y llamar a _persistence_getPropertyChangeListener() y luego getObjectChangeSet().

Si está utilizando TopLink Essentials, los eventos del descriptor también se aplican, pero el seguimiento de cambios no se tejió.

+0

¿Hay alguna manera de hacer algo similar con Hibernate? – tazmaniax

Cuestiones relacionadas