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