2

AppEngine でエンティティを永続化するために Objectify を使用しています。

いくつかのエンティティで、creationTime と lastUpdateTime を保存したいと考えています。

私の意図は、エンティティが初めて作成されたときに、作成時間がエンティティに追加されることです。エンティティが更新されるたびに、LastUpdate 時刻を更新する必要があります。

lastUpdateTime については、簡単に@PrePersistフックをアタッチして lastUpdateTime を変更できます。

しかし、エンティティを更新するときはいつでも、creationTime を保持したいと考えています。

解決策の 1 つは、creationTime をフェッチしてからエンティティに追加することです。

保存するたびに creationTime をフェッチする必要がない方法はありますか?

Objectify がこれを無視することを期待して、creationTime を null に設定して組み合わせてみました@NotSaved(IfNull)が、実際の動作は、データストアで 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 には、2 つの不変フィールド (id、creationTime) と 2 つの可変フィールド (lastUpdateTime、mutableField2) が含まれているとします。

コンテキストによっては、これら 5 つのフィールドすべてがクライアントに送信され、クライアントが mutableFields を更新し、可変フィールドを更新する要求を送信する可能性があります。

説明を簡単にするために、Session とその他の方法 (NameSpace など) を使用して、ユーザーがこのエンティティを変更できることを確認できると仮定します。

今、私の意図は次のことを行うことです:
* エンティティが初めて作成されるときは、constructor1 を使用します。
* クライアントがこのエンティティを要求すると、サーバーは (id と mutablefield) を送信します。
* クライアントは、ID とともに mutableField の新しい値でエンティティを更新するリクエストを送信します。
* サーバー側では、作成時間を失うことなく可変フィールドを更新したいと考えています。

これは、最初に DataStore からエンティティを取得し、次に mutableField を更新してから再度永続化することで実行できます。より良い解決策があるかどうか疑問に思っていました。

4

1 に答える 1

1

コンストラクターを使用します。

public class TestEntity {
    public TestEntity(...your normal init params...) {
        creationTime = new Date();
    }
}
于 2012-04-26T16:59:41.133 に答える