Google App Engine for Javaで
結構似たデータ構造を持つ情報をデータストアで管理しようとしたときのこと。
GAEの場合、データは永続化クラスとしてデータストアに格納されるので、
どんなに似ていても、それぞれのデータクラスを用意しなきゃいけない。
めんどくせーーーーーーーーーー
って思いながら、継承出来ないのかな?
と調べてみたら
Google App Engineどきゅめんと
の最終行
・以下引用・
現在、スーパークラスの永続フィールドがデータストアに保存できないというバグがあります。今後のリリースで修正される予定です。
・引用おわり・
これ(やろうとした事は)は↑の事なんだろうなと思って
検証せずに終わりました。
保守性考えると将来的には直ってほしいもの。
データストアに無いモデルを取得しようとすると
org.datanucleus.store.appengine.FatalNucleusUserException
…(略)…
Perhaps you need to run the enhancer on this class?
というのが出る。
主幹でもないのにデータ入れないと動かないというのは…
うーん。。。
と思ったものの、仕方ないので
try/catchで
JDOFatalUserException
をキャッチして例外処理で暫定対処することに。
ただ、原因が本当にデータストアにモデルがセットされていない事なのかは未検証。
明日時間があったら見てみようか。
org.datanucleus.store.appengine.FatalNucleusUserException
…(略)…
Perhaps you need to run the enhancer on this class?
というのが出る。
主幹でもないのにデータ入れないと動かないというのは…
うーん。。。
と思ったものの、仕方ないので
try/catchで
JDOFatalUserException
をキャッチして例外処理で暫定対処することに。
ただ、原因が本当にデータストアにモデルがセットされていない事なのかは未検証。
明日時間があったら見てみようか。
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
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