2011-07-06 12 views
7

que tienen una entidad con camposDE ACTUALIZACIÓN CURRENT_TIMESTAMP y JPA

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "edit_timestamp", 
     columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 
private Date editTimestamp; 

@Version 
@Column(name = "edit_count") 
private short editCount; 

private String text; 

Cuando intento actualizar con Spring-Data-JPA, observo EDIT_COUNT se ha incrementado, pero edit_timestamp todavía siguen siendo los mismos. Si invoco manualmente SQL

UPDATE post SET TEXT='456' WHERE post_id=1; 

edit_timestamp se ha actualizado. Si agrego

@PreUpdate 
protected void onUpdate() { 
    editTimestamp = new Date(); 
} 

funciona sin problema. Mi pregunta es por qué w/o @PreUpdate el edit_timestamp no se actualiza?

+1

Para downvoter, por favor indique su comentario ... –

Respuesta

6

Esta es una vieja pregunta, pero pensé que podría arrojar una respuesta en caso de que alguien más lo encuentre útil. Creo que necesita cambiar la anotación de la columna para incluir updatable = false. Esto hará que la columna edit_timestamp no se muestre en la actualización sql, por lo que el proveedor de JPA no incluirá el valor actual del campo, que es lo que está causando que anule el valor predeterminado.

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "edit_timestamp", 
     updatable = false 
     columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 
private Date editTimestamp; 
+0

Esto es parcialmente trabajo. Con updatable = false, la columna edit_timestamp no aparece en la consulta de actualización. De la base de datos, observé que edit_timestamp se ha actualizado. Sin embargo, getter para editTimestamp no tiene conocimiento del valor actualizado, ya que no se desencadena por @PreUpdate, por lo que aún devuelve el valor anterior. –

0

Porque en su conjunto inicial de anotaciones, todo lo que le ha dicho sobre la columna edit_timestamp es que es una marca de tiempo; JPA no sabe que necesita actualizarlo. Supongo que cuando estás ejecutando manualmente la instrucción SQL, tienes algún tipo de activador en la actualización que cambia esos campos por ti, pero se sobrescriben con los datos que provienen de la entidad persistente cuando la actualizas.
Si no necesita el contador/indicación de tiempo 'editado', intente eliminarlos de la entidad y vea si eso funciona. De lo contrario, tienes una solución de trabajo.

Cuestiones relacionadas