sola's note -22ページ目

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

GAEではあるエンティティモデルにエンティティのコレクションを持たせると
親となるエンティティにはLong型のidが付き、
子のコレクションの一部になるエンティティにはKey型のkeyが付く。
(勿論それぞれのエンティティで定義は必要)

このとき、親のidにはユニークな値が入るけど
子のkeyには親のキーとアプリケーションまたはシステムで生成した数値IDを
組み合わせたものになるらしい。
エンティティのキーについて

子のkey = 親のkey + (appli or system)id

このKey型はgetIdメソッドを用意していて、
どうやらなんらかしらのIDが取得できる
このなんらかしらのIDが、

データストアに子が記録された時に、ひっそりとIDとなっている値と一致

している気がするので、恐らくこれは子エンティティのidなんだろうと思う。
疑問に思っているのは別にあって、

親→子→子→子→親…

と、いくつか作成してみると、

どうも


idが親と子を合わせて連番になっているように見える


 何 故 だ 。


問題というわけじゃないけど、id生成の規則性は意外とシンプルなのかなと。
前回の
JDOFatalUserExceptionその2
と似ている問題。

エンティティのモデルにするクラスのidに

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)

を指定しないと

org.datanucleus.exceptions.NucleusUserException: Identifier xxx is unresolved (not a static field)

って言われる。
xxxはidの変数ではないので、意外と気づくのに遅れるかも。
staticなんて指定してないよーとか思ってたら全然違う。

そろそろ慣れてきて手抜きが目立ってきたな…。
以前ぶちあたった

JDOFatalUserException

の謎。
  データストアにエンティティ詰めずにリクエストしたらJDOFatalUserException?

の原因がわかった。
原因というか、ただのミスなんだけど、

エンティティのモデルにするクラスに

@PersistenceCapable(identityType = IdentityType.APPLICATION)

をつけ忘れていたのがいけなかったみたい。
JDOを使う時の条件として
  Google App Engine for Javaのドキュメント
には

☆以下引用☆
1. クラスに [@PersistenceCapable(identityType = IdentityType.APPLICATION)] アノテーションをつける。
2. メンバー変数に Long 型の id を定義し、[@PrimaryKey] アノテーションと[@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)] アノテーションをつける。
3. 永続化したいメンバー変数に 「@Persistent」 アノテーションをつける。
☆引用終わり☆

と書いてあったんだけど、
この1個目が足りないと、クエリ生成/送信時に

JDOFatalUserException

が投げられるみたいです。

Perhaps you need to run the enhancer on this class?

と言われたら、疑うといいかも。