Datastoreに格納されたEntityの更新について

今のところGAE/j使うときにはslim3を利用するようにしているんだけど、使い方で間違ってたところに気づいたのでメモ。

Entityを更新するときには取り出して値を更新してから格納、という流れになるんだけど、間違ってこうしてた。

MyModelMeta meta = MyModelMeta.get();
MyModel model = Datastore.query(meta)
                    .filter(meta.field.equal("value"))
                    .asSingle();
if(model != null) {
    model.setField("newValue");
    Datastore.put(model);
}

きちんと理解したら当たり前だよね。
検索して取得したものと実際に格納されてるものって別だもの。
このまんまじゃ良く似た別の MyModel をputしてるだけじゃん!

なので

MyModelMeta meta = MyModelMeta.get();
Key key = Datastore.query(meta)
                    .filter(meta.field.equal("value"))
                    .asKeyList();
if(key.size() > 0) {
    MyModel model = Datastore.get(MyModel.class, key.get(0));
    model.setField("newValue");
    Datastore.put(model);
}

って感じでKeyをつかって格納されたEntityそのものを編集しないとだめなんだよね。

ということで、更新のためには Datastore.get() を使うんだよ、と自分に言い聞かせておく。