2009-11-17 13 views
11

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; 
    } 


} 

Respuesta

16

Uso @PrePersist y @PreUpdate anotaciones y escribir su propio detector de eventos.

Eche un vistazo a this answer para más detalles. Está etiquetado como Hibernate, pero se aplica a cualquier proveedor de JPA.

1

si está utilizando MySQL, creo que se puede hacer lo siguiente para desactivar las marcas de tiempo se actualice de una entidad

@Column(name = "lastUpdate", updatable= false, insertable=false) 
@Temporal(TemporalType.TIMESTAMP) 
private Date lastUpdate; 

para Oracle que el tiempo que establecer las marcas de tiempo desde la entidad de anotación utilizando como @PreUpdate explicado arriba.

+0

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

+0

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

+0

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

1

En realidad, surajz answer works. Considere un escenario donde está rastreando 2 marcas de tiempo. Desea actualizarlos manualmente a través de la entidad. Debería configurar uno al updateble=false (el que no desea que se actualice cuando se actualice el registro) y dejar el otro libre para actualizaciones.

Eso es lo que funcionó para mí.

Cuestiones relacionadas