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() を使うんだよ、と自分に言い聞かせておく。