キーによるエンティティの取得

RDBMSでいうところの主キーによるエンティティの取得方法について学習したのでメモ。Googleの説明(英語)は↓。
http://code.google.com/intl/en/appengine/docs/java/datastore/creatinggettinganddeletingdata.html

主キーの設定

全部で4種類ある。

  • Long
  • String
  • Key
  • Encoded String

最後のはちょっとよく分からなかったので、ここでは一旦パス。
one-to-manyの関連を作る時は、両方ともKeyにしないといけないみたいなので、おそらくStringやLongよりもKeyオブジェクトをよく使用することになるのではないでしょうか。
設定はアノテーションを利用して行います。

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;

キーによるエンティティ取得

Webアプリケーションなので、サーバー側で取得した値も一旦はHTMLという文字列の世界に落としこまれます。LongやStringなら復元も簡単ですが、Keyオブジェクトの場合は一手間必要。
HTMLに落とし込む時に、Key#getIdメソッドを利用すればlong型の値が取得できます。この値をHTMLで保持しておき、リクエスト時にこの値をサーバーに送って、Keyを復元してやればいけます。復元にはKeyFactoryを使用します。

String id = request.getParameter("id");
Key key = KeyFactory.createKey(Parent.class.getSimpleName(), Long.valueOf(id));
PersistenceManager pm = PMF.getPersistenceManager();
Parent parent = pm.getObjectById(Parent.class, key);

Child側のKeyを取得するには、ParentのKeyも必要になります。

Key childKey = KeyFactory.createKey(parentKey, Child.class.getSimpleName(), Long.valueOf(childId));


なお余談ですが、ChildのKey#toStringを呼び出すと、

Parent(33)/Child(5)

こんな風になります。エントリポイントからの情報がつまっていることが確認でき、key-value型データストアの一部を垣間見れたようなw。