2009-11-17 32 views
11

我正在玩JPA(Eclipselink具體)。下面的實體有一個 時間戳,應該反映實體上次更新的時間戳。最後一次更新時間戳與JPA

什麼是使JPA自動更新時間戳的策略是什麼? 這個實體被更改了嗎?

如果我還想創建一個'創建'時間戳,那麼只有當實體第一次持續時才設置,從未允許再次更改?

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


} 

回答

1

如果你正在使用MySQL,我覺得你可以做以下從實體

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

被更新爲Oracle您的時間禁用時間戳必須設置使用@PreUpdate註釋從實體的時間戳如上所述。

+0

這是錯誤的,原因很多:(1)上面假設你手動更新時間戳,因此設置「可更新」是毫無意義的; (2)因此,如果沒有@PreUpdate/@PrePersist事件偵聽器,上述方法將無法工作; (3)如果您希望數據庫生成您的時間戳(您似乎暗示),則必須將您的屬性標記爲生成的JPA標準中的** not **; (4)最後,MySQL不會讓你在同一個表中有2個自動更新的時間戳。 – ChssPly76 2009-11-17 01:05:09

+0

關於mysql,您可以創建一個或多個觸發器來更新任意數量的列,如時間戳 - 您不限於表中的1個自動更新的時間戳。 – nos 2009-11-17 16:56:37

+0

在MySql中,您還可以使用2個時間戳創建表,並在插入記錄時在兩個字段上插入NULL。 create table ts( last_updated_ts TIMESTAMP, created_ts TIMESTAMP, name varchar(5)); insert into ts(last_updated_ts,created_ts,name)value(null,null,'test'); 根據客戶端如何訪問數據庫,肯定觸發或註釋更好。 – surajz 2009-11-17 17:19:53

1

其實,surajz答案的作品。考慮一個跟蹤2個時間戳的場景。你想通過實體手動更新它們。你需要設置一個到updateble=false(當記錄更新時你不想更新的那個),並且讓其他人免費更新。

這就是爲我工作。