キーによるエンティティの取得
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。