2012-04-26 62 views
2

我正在使用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,然後再堅持。我想知道是否有更好的解決方案。

回答

1

使用你的構造函數。

public class TestEntity { 
    public TestEntity(...your normal init params...) { 
     creationTime = new Date(); 
    } 
} 
+0

感謝。我認爲我的問題沒有給出完整的圖像,所以我更新了accrodingly。只要實體位於AppEngine內部,您提出的解決方案就會很好地工作。但是,如果我將此實體發送給客戶端,並且客戶端想修改實體的某個部分,則(a)必須將creationTime發送給客戶端,並期望不會修改,或者(b)從DataStore執行提取並根據客戶請求更新字段(不觸及creationTime)。我想知道這兩個步驟是否都可以避免。 – Arjun 2012-04-26 21:04:21

+0

@Arjun當你向客戶端發送數據時,你將不得不以客戶端能夠識別的某種格式序列化它。你如何在數據存儲實體之間進行轉換完全取決於你。 – 2012-04-27 03:53:14