2009-11-17 11 views
11

Sto giocando un po 'con JPA (Ecliplink per essere specifico). L'entità sottostante ha un timestamp che dovrebbe riflettere ogni volta che l'entità è stata aggiornata l'ultima volta.Data/ora ultimo aggiornamento con JPA

Quali sono le strategie per fare in modo che JPA aggiorni quell'indicazione cronologica automaticamente ogni volta che viene modificata questa entità? ?

Come scegliere se desidero un timestamp di "creazione", impostato solo quando l'entità viene prima mantenuta, non è più possibile modificarla di nuovo?

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


} 

risposta

16

Usa @PrePersist e @PreUpdate annotazioni e lascia la tua listener di eventi.

Dai uno sguardo allo this answer per i dettagli. È etichettato come Hibernate ma è applicabile a qualsiasi provider JPA.

1

se si utilizza MySQL, penso che si può eseguire le seguenti operazioni per disabilitare i timestamp di essere aggiornato da entità

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

per Oracle il tempo necessario impostare i timestamp dall'entità con annotazioni @PreUpdate come spiegato sopra.

+0

Questo è sbagliato per molte ragioni: (1) quanto sopra presuppone che stai aggiornando manualmente il timestamp, quindi l'impostazione "aggiornabile" è inutile; (2) di conseguenza, quanto sopra non funzionerà senza gli ascoltatori di eventi @PreUpdate/@PrePersist; (3) se vuoi che il database generi i tuoi timestamp (che sembri implicare), devi contrassegnare le tue proprietà come generate che ** non ** sono nello standard JPA; (4) Infine, MySQL non ti consente di avere 2 timestamp autoaggiornati nella stessa tabella. – ChssPly76

+0

Per quanto riguarda mysql, puoi creare uno o più trigger per aggiornare qualsiasi numero di colonne, ad esempio un timestamp: non sei limitato a 1 timestamp aggiornato automaticamente in una tabella. – nos

+0

in MySql puoi anche creare una tabella con 2 timestamp e inserire NULL su entrambi i campi quando inserisci un record. creare tabella ts ( last_updated_ts TIMESTAMP, created_ts TIMESTAMP, nome varchar (5)); inserire nel valore ts (last_updated_ts, created_ts, name) (null, null, 'test'); Definitivamente il trigger o l'annotazione sono migliori in base a come il client accede al database. – surajz

1

In realtà, surajz funziona come risposta. Considera uno scenario in cui stai monitorando 2 timestamp. Vuoi aggiornarli manualmente tramite l'entità. Dovresti impostarne uno su updateble=false (quello che non vuoi aggiornare quando il record è aggiornato), e lasciare libero l'altro per gli aggiornamenti.

Questo è quello che ha funzionato per me.

Problemi correlati