Slim3では、GAEのmodelに対して、
自動的に登録日等を設定出来るようなアノテーションがあります。
登録日:
@Attribute(listener = CreationDate.class)
更新日:
@Attribute(listener = ModificationDate.class)
とかですね。
使い方としてはmodelクラスのフィールドに
/** 登録日時 */
@Attribute(listener = CreationDate.class)
private Date createDate;
といった感じで記載します。
(その他別途setter、getterは必要です。)
そうすると、
Hoge.setCreateDate(new Date());
とかしなくても、Datastoreにputした時の日付が自動的にセットされます。
但し、一点落とし穴があります。(勝手に落ちているだけかもしれませんが)
というのも、正しく動作しない場合があります。
ここではそれぞれについて書いてみます。
まず正しく動作する場合
■正しい動作
1.登録
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = new Hoge();
hoge.setKey(key);
Datastore.put(hoge);
2.更新
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = Datastore.get(meta,key);
Datastore.put(hoge);
上記の例では、何も追加せずに更新しておりますが、
最小限でやるとこうなります。
Keyの生成は登録時は必須ではありませんが、今回の解説の便宜上やっています。
正しい動作の場合、ちゃんと上記のやり方で登録日と更新日が登録されます。
それでは次にそうじゃない場合について記載します。
■そうじゃない動作
1.登録
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = new Hoge();
hoge.setKey(key);
Datastore.put(hoge);
2.更新
Key key = KeyFactory.createKey("Hoge","foo");
Hoge hoge = new Hoge();
hoge.setKey(key);
Datastore.put(hoge);
更新でなんでそんな事しているんだとか言われそうですが、
元々登録されていたデータはどうでもよくて、
とにかくKeyだけを同じにして上書きしてやろう
という時に出てくる発想です。
勿論上記の例ではKey以外に何もパラメータを設定していないので、
バカみたいな処理を行っていますが、Datastoreに対しての読み込みコストを削減したい場合は、
有りうる手法なのではないかと思います。
ですが、
この場合、登録日(createDate)は更新時点の日付になってしまいます。
Slim3の内部処理を確認していないので、あくまで結果論となりますが、
いくらKeyが同じでも、オブジェクトを新規に生成した場合は
@Attribute(listener = CreationDate.class)
は、初回登録以降も更新され続けます。
気を付けて下さい。