getObjectByIdで取得したエンティティの子エンティティコレクションがない | sola's note

sola's note

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

Google App Engine for Javaで
IDを指定してエンティティをデータストアから取得する場合、
getObjectByIdメソッドを用いる。

PersistenceManager pm = PMF.get().getPersistenceManager();
try{
    TestDto testDto = pm.getObjectById(TestDto.class, idLong);
}finally{
    pm.close();
}

雑だけど↑のようにして取得することができるんだけど、
一つ問題に気付いた。

それは取得するエンティティが子オブジェクトのコレクションを保持している場合。
上記の場合で言うなら
TestDtoが

List<ChildTest> childTest = null;

みたいなフィールドを持っていた時。
問題の内容としては前述のgetObjectByIdメソッドでTestDtoを取得し、
サーブレットからJSPに情報を渡すと

childTestコレクションの値が存在する場合とnullの場合があった。

正直意味わかんねーよって思った。
発端は昨日の
ブレークポイントで止まらない
の時。

で、ブレークポイントで止まらない事件は
ブレークポイントで止まらない2
で解決したので、

デバッグして見てやる!!!

というところ。
今回の事象としては、

TestDtoの子エンティティであるChildTest(勿論両方とも本当のエンティティ名は別の名前)
をgetObjectByIdメソッドで取得したTestDto越しに更新(add)する時は

更新が出来る。

しかし、
getObjectByIdで取得したTestDtoをJSPに持って行って
子エンティティであるChildTestを表示しようとしたら

値がnull…。

そんな時。

結論から言うと、(既に前置きが長いけど。。。)
getObjectByIdメソッドでTestDtoを取得した時は


どちらも子エンティティ(コレクション)の値はnullだった


これはマジで驚いた。
じゃあ更新の時はどこで正常に更新してるんだよと思いながら



nullだったらgetしている時にNull Pointerになるんじゃね…?



とか思ったら







nullであったはずの子エンティティ(コレクション)を取得すると代入先に値がセットされている







という不思議が起きていた。
色々やってみたけど、どうやら参照を行うと値が詰まる模様。(結果論で根拠なし)

処理速度向上のための仕様なのかは定かではないけど、
子エンティティ(コレクション)を用いている場合は気をつけないと。。。

というか他にそのためのメソッドがあるのかな…?

※試していないけど、子エンティティコレクションの参照を
pm.close();
の後に実行したら多分ダメなので気をつけて。

実証しろって?

メンドクサイ…w