Google App EngineのJDOで1:1の同一子Entityを複数持つ場合にうまく登録できなかったミス
Entityに同じ子Entityが別フィールドで複数ぶら下がるようなケースで、
ローカル実行すると、各子Entityが出来るのだが、親Entityには全て同じ子Entityがぶら下がってしまう。
さらにサーバで実行すると
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.
というエラー
なんつーかindexですが・・・
ちなみに親Entityはkeyをアプリで生成しているんだけど、その絡みかなぁ・・・
というわけで、EntityGroupでやるように子Entityのkeyも生成かな。
中略 Key key = KeyFactory.createKey(Result.class.getSimpleName(), keyStr); Result result = new Result(); result.setKey(key); 中略 result.setFirstPrize(createPrize(firstNums, firstPrize)); result.setSecondPrize(createPrize(secondNums, secondPrize)); result.setThirdPrize(createPrize(thirdNums, thirdPrize)); result.setFourthPrize(createPrize(fourthNums, fourthPrize)); result.setFifthPrize(createPrize(fifthNums, fifthPrize)); 中略 } private Prize createPrize(String nums, String prize) { Prize prizeObj = new Prize(); prizeObj.setNum(Integer.valueOf(nums)); prizeObj.setPrize(Integer.valueOf(prize)); return prizeObj; }
こんなコードなんですが・・・
その後、子EntityもKeyFactoryでkeyを作成するようにしたんですが・・・駄目ですね。
しょうがないので、フィールドを配列にしようかなぁ・・・
なんて思ってたんですが、JUnitテストだとそんなこと無いんだよなぁ・・・
と思い色々比較したら、doPostからのdoGetの流れの中で、
EntityManagerのopenとcloseを二度行なっているのがまずそう。
というか以前そんなのを何処かで見た気がするので直したら無事成功。
なんてこったーですね。
あとからfilterに持っていこうと思っていたのに・・・
しょっぱなから出鼻をくじかれた感じです。
ちなみに、サーバに乗っけて出たエラーは相変わらず。
key descから、別項目でソートにしたら平気になりました。
keyのソートって駄目なの??
はたまた、データ登録とビルドのすぐだったから駄目だっただけかな?(index作成中??)
なんつーか一歩一歩だなぁ(^^;
追記
登録後見ると大丈夫だが、
再度Entityを取得すると、同一の子Entityが全てぶら下がってしまう・・・
(まぁ登録後といってもmakePersistentに渡したEntityをそのまま表示しているだけなので、
再度取得して表示すれば結局同じ結果なんだろうけど)
何が駄目なんだかなぁ