えいのうにっき

a-knowの日記です

GAE/J + Slim3 で、特定の文字列からKeyを生成する方法&親キーを指定した上でKeyを生成する方法

Google App Engine/Java + Slim3 では、「データを一意に取得できさえすればいい」場合、特にKeyには何も指定せずにputできます。

Activity putActivity  = new Activity();
putActivity.setEvent("新規ユーザー登録");
Datastore.put(putActivity);


Activity getActivity = Datastore.get(putActivity.getKey());//Keyは自動的に生成される

でも、例えばユーザーを表すUserエンティティなどの場合、「ログインIDを主キーにしたい」という場合があると思います。 そういうときは、Datastore.createKey()を使い、以下のようにすればOKです。

User putUser = new User();
putUser.setKey(Datastore.createKey(User.class, "a-know"));//"a-know"がログインIDに相当
putUser.setTwitterID("@a_know");
Datastore.put(putUser);


User getUser = Datastore.get(Datastore.createKey(User.class, "a-know"));//ログインID文字列からKeyを生成

こうすることで、この場合ではログインIDさえわかっていれば、Keyを生成できることになります。

さらに、親キーを指定した上でKeyを生成することもできます。 上記Userエンティティが登録されている上で、ユーザーごとに日記・Diaryエンティティ(一日一エントリのみとする)を保持するとした場合。 Datastore.createKey()を使って以下のようにすることでKeyを生成することができ、また生成されたKeyのgetParent()で親キーを取得することができます。

Key userKey = Datastore.createKey(User.class, "a-know");//親となるUserキーを作っておく

Diary diary1 = new Diary();
diary1.setKey(Datastore.createKey(userKey, Diary.class, "2012-6-15"));//第一引数に親キーを指定
diary1.setContent("今日はいまいちだった。");
Datastore.put(diary1);

Diary diary2 = new Diary();
diary2.setKey(Datastore.createKey(userKey, Diary.class, "2012-6-16"));
diary2.setContent("今日はまぁまぁだった。");
Datastore.put(diary2);

Diary diary3 = new Diary();
diary3.setKey(Datastore.createKey(userKey, Diary.class, "2012-6-17"));
diary3.setContent("今日はイケイケだった。");
Datastore.put(diary3);


Key getUserKey = diary2.getKey().getParent();//Key.getParent()で親キー取得。

これで簡単に、親エンティティのキーを取得することができますね。