我正在使用Objectify在AppEngine上持久化實體。如何爲AppEngine實體添加creationTime
在幾個實體中,我想存儲creationTime和lastUpdateTime。
我的本意是在第一次被創建時所創建時間被添加到實體。 而LastUpdate時間應該更新,只要實體更新。
對於lastUpdateTime我可以輕鬆地使用@PrePersist
附加一個鉤子修改lastUpdateTime。
但是,每當我對實體進行更新時,我想保留creationTime。
現在一個解決方案是獲取creationTime,然後將其添加到我的實體。
有沒有什麼辦法可以在每次保存之前不必取得創建時間?
我試過@NotSaved(IfNull)
的組合,然後將creationTime設置爲null,希望Objectify會忽略這個,但實際的行爲是它會在數據存儲上設置creationTime = null。
僅供參考,我的實體是這樣的:
public class TestEntity {
@Id
Long id;
Date creationTime;
Date lastUpdateTime;
String mutableField;
...
// Constructor1
public TestEntity(Long id, Date date, String mutableField) {
this.id = id;
creationTime = date;
lastUpdateTime = date;
this.mutableField = mutableField;
}
// Constructor2
public TestEntity(Long id, String mutableField) {
this.id = id;
lastUpdateTime = new Date();
this.mutableField = mutableField;
}
}
EDIT1:
對不起。我認爲我的問題並不完整。我修改了我的TestEntity定義。讓我們假設這個TestEntity包含兩個不可變字段(id,creationTime)和兩個可變字段(lastUpdateTime,mutableField2)。
現在,根據上下文,很可能這五個字段全部被髮送到客戶端,然後客戶端更新mutableFields併發送更新可變域的請求。
爲了簡化討論,我們假設使用會話和其他一些方式(例如命名空間),我們可以確保用戶可以修改該實體。
現在我的意圖是做以下事情:
*當第一次創建實體時,使用constructor1。
*當客戶端詢問這個實體時,服務器發送(id和mutablefield)。
*客戶端發送一個請求,使用Id的mutableField的新值更新實體。
*現在在服務器端,我想在不丟失creationTime的情況下更新可變字段。
現在這個可以先取出從數據存儲實體來完成,然後更新mutableField,然後再堅持。我想知道是否有更好的解決方案。
感謝。我認爲我的問題沒有給出完整的圖像,所以我更新了accrodingly。只要實體位於AppEngine內部,您提出的解決方案就會很好地工作。但是,如果我將此實體發送給客戶端,並且客戶端想修改實體的某個部分,則(a)必須將creationTime發送給客戶端,並期望不會修改,或者(b)從DataStore執行提取並根據客戶請求更新字段(不觸及creationTime)。我想知道這兩個步驟是否都可以避免。 – Arjun 2012-04-26 21:04:21
@Arjun當你向客戶端發送數據時,你將不得不以客戶端能夠識別的某種格式序列化它。你如何在數據存儲實體之間進行轉換完全取決於你。 – 2012-04-27 03:53:14