Me encontré con algunas preguntas similares en StackOverflow, intenté con las soluciones, pero no encontré una respuesta.Llamada de EclipseLink JPA `@ PreUpdate` no persistiendo
Estoy usando una estrategia de JPA bastante común para establecer los últimos tiempos modificados en algunas entidades. Configure las columnas y los campos, luego marque un método con @PreUpdate
y déjelo establecer igual a la hora actual.
El problema es que puedo ver en el depurador que se está llamando al método y que el campo se está actualizando; sin embargo, en mis registros de DB solo veo una llamada SQL para ACTUALIZAR el campo modificado que NO incluye una ACTUALIZACIÓN para el campo de marca de tiempo.
Para complicar aún más las cosas @PrePersist
funciona perfectamente, solo @PreUpdate
presenta este comportamiento.
La explicación más cercana que he encontrado hasta ahora es en este LINK.
preguntas similares a: # 1725699 y # 1745890
estoy usando EclipseLink v2 y v1 APP para la compatibilidad con GlassFish v2.
He intentado usar ambas anotaciones directamente en los métodos de la clase de entidad, así como un EntityListener
unido a la clase de entidad con el @EntityListener
anotación.
Sospecho que esto es un error en EclipseLink, pero no lo puedo probar.
Bug o no me gustaría mucho que esta simple operación a trabajar. ¿Hay algo malo con esta implementación? ¿Es este un problema conocido en EclipseLink? ¿Es este un problema conocido en JPA? ¿Hay alguna forma de evitar esto?
En lugar de ir a la base de datos y usar desencadenadores, ¿hay alguna ruta alternativa para que mi código Java establezca la marca de tiempo update_on?
¡Gracias por el consejo!
Los fragmentos de código siguen.
camposInstitución:
@Column(name = "updated_on")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedOn;
@Column(name = "created_on")
@Temporal(TemporalType.TIMESTAMP)
private Date createdOn;
métodos de actualización anotados:
@PreUpdate
public void setUpdatedOn(Timestamped object) {
object.setUpdatedOn(new Date());
}
@PrePersist
public void setCreatedOn(Timestamped object) {
if (object.getCreatedOn()==null) {
object.setCreatedOn(new Date());
}
}
Felix - Gracias por la aclaración. Pensé que eso era lo que estaba viendo. Veo cómo implementar el manejo del DescriptorEvent, casi tan fácil como anotar algunos métodos. Solo tengo que encontrar el archivo XML correcto para agregar el controlador. ¡Gracias de nuevo! – Freiheit
Hola, Freiheit, estoy enfrentando el mismo problema en este momento, ¿te importaría compartir tu código DescriptorEvent como ejemplo? :) Gracias – sunnycmf
@Freiheit me encantaría ver la solución también. Gracias por adelantado. –