我正在玩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)上面假設你手動更新時間戳,因此設置「可更新」是毫無意義的; (2)因此,如果沒有@PreUpdate/@PrePersist事件偵聽器,上述方法將無法工作; (3)如果您希望數據庫生成您的時間戳(您似乎暗示),則必須將您的屬性標記爲生成的JPA標準中的** not **; (4)最後,MySQL不會讓你在同一個表中有2個自動更新的時間戳。 – ChssPly76 2009-11-17 01:05:09
關於mysql,您可以創建一個或多個觸發器來更新任意數量的列,如時間戳 - 您不限於表中的1個自動更新的時間戳。 – nos 2009-11-17 16:56:37
在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