Estoy jugando un poco con JPA (Eclipselink para ser específico). La siguiente entidad tiene una marca de tiempo que se supone que debe reflejar cada vez que la entidad se actualizó por última vez.Hora de la última actualización marca de tiempo con JPA
¿Cuáles son las estrategias para hacer que la actualización de JPA esa marca de tiempo automáticamente cada vez que se cambia esta entidad?
¿Cómo me iría si también quisiera una marca de tiempo de 'creación', solo configurada cuando la entidad se conserva por primera vez, nunca se permite volver a modificarla?
@Entity
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String note;
public Item() {
}
@Id
@GeneratedValue(strategy=SEQUENCE)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=255)
@Column(nullable=false)
public String getNote() {
return this.note;
}
public void setNote(String note) {
this.note = note;
}
@Column(nullable=false)
public Timestamp getUpdated() {
return this.updated;
}
public void setUpdated(Timestamp updated) {
this.updated = updated;
}
}
Esto es incorrecto por muchas razones: (1) lo anterior supone que está actualizando manualmente la marca de tiempo, por lo que establecer "actualizable" no tiene sentido; (2) en consecuencia, lo anterior no funcionará sin los detectores de eventos @PreUpdate/@PrePersist; (3) si desea que la base de datos genere sus marcas de tiempo (lo cual parece implicar), debe marcar sus propiedades como generadas que ** no ** en el estándar JPA; (4) finalmente, MySQL no le permitirá tener 2 marcas de tiempo autoactualizadas en la misma tabla. – ChssPly76
Con respecto a mysql, puede crear uno o más desencadenantes para actualizar cualquier cantidad de columnas, como una marca de tiempo; no está limitado a 1 marca de tiempo actualizada automáticamente en una tabla. – nos
en MySql también puede crear una tabla con 2 marcas de tiempo e insertar NULL en ambos campos al insertar un registro. create table ts ( last_updated_ts TIMESTAMP, created_ts TIMESTAMP, name varchar (5)); insertar en ts (last_updated_ts, created_ts, name) value (null, null, 'test'); Definitivamente desencadenar o anotar es mejor dependiendo de cómo el cliente accede a la base de datos. – surajz