Slim3のAttribute listenerに注意 | sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

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)

は、初回登録以降も更新され続けます。
気を付けて下さい。