2009-11-17 13 views
11

Ich spiele ein bisschen mit JPA (Eclipselink um genau zu sein). Die folgende Entität hat einen Zeitstempel, der immer dann reflektiert werden sollte, wenn diese Entität zuletzt aktualisiert wurde.Letztes Update Timestamp mit JPA

Was sind die Strategien, damit JPA diesen Zeitstempel jedes Mal automatisch aktualisiert, wenn diese Entität geändert wird?

Wie würde ich vorgehen, wenn ich auch einen 'creation' timestamp haben möchte, der nur gesetzt wird, wenn die Entity zuerst persistent ist und nie wieder geändert werden darf?

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


} 

Antwort

16

Verwenden @PrePersist und @PreUpdate Anmerkungen und Ihren eigenen Ereignis-Listener schreiben.

Weitere Informationen finden Sie unter this answer. Es ist als Hibernate getaggt, ist aber für jeden JPA-Anbieter anwendbar.

1

, wenn Sie MySQL verwenden, glaube ich Ihnen folgendes deaktivieren können tun, um die Zeitstempel von von Einheit aktualisiert

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

für Orakel Sie Zeit, um die Zeitstempel von der Einheit setzen müssen mit @PreUpdate Annotation oben erklärt.

+0

Dies ist aus mehreren Gründen falsch: (1) das oben genannte geht davon aus, dass Sie den Zeitstempel manuell aktualisieren und die Einstellung "aktualisierbar" sinnlos ist; (2) Folglich funktioniert das obige nicht ohne @PreUpdate/@ PrePersist Event Listeners; (3) Wenn Sie möchten, dass die Datenbank Ihre Zeitstempel generiert (was Sie zu implizieren scheinen), müssen Sie Ihre Eigenschaften als generiert markieren, was im JPA-Standard ** nicht ** ist; (4) Schließlich lässt MySQL 2 automatisch aktualisierte Zeitstempel in derselben Tabelle nicht zu. – ChssPly76

+0

In Bezug auf mysql können Sie einen oder mehrere Trigger erstellen, um eine beliebige Anzahl von Spalten zu aktualisieren, z. B. einen Zeitstempel - Sie sind nicht auf 1 automatisch aktualisierte Zeitmarke in einer Tabelle beschränkt. – nos

+0

in MySql können Sie auch Tabelle mit 2 Zeitstempel erstellen und NULL für beide Felder einfügen, wenn Sie einen Datensatz einfügen. Tabelle erstellen ( last_updated_ts TIMESTAMP, created_ts TIMESTAMP, Name varchar (5)); Einfügen in ts (last_updated_ts, created_ts, name) Wert (null, null, 'test'); Definitiv Trigger oder Annotation ist besser abhängig davon, wie der Client auf die Datenbank zugreift. – surajz

1

Eigentlich funktioniert surajz Antwort funktioniert. Stellen Sie sich ein Szenario vor, in dem Sie zwei Zeitstempel verfolgen. Sie möchten sie manuell über die Entität aktualisieren. Sie müssen einen Wert auf updateble=false setzen (den, den Sie nicht aktualisieren möchten, wenn der Datensatz aktualisiert wird) und den anderen für Updates frei lassen.

Das hat bei mir funktioniert.

Verwandte Themen