iBatisのLazyLoading

iBatisマッピング時にnullが入るはずのmodelに
com.ibatis.sqlmap.engine.mapping.result.loader.EnhancedLazyResultLoader$EnhancedLazyResultLoaderImpl
なんていうオブジェクトが入ってた。



←これ。

何こいつ?
そういえば遅延ローダーあるって言ってたね君。
で、設定見てみると見事に…

sqlMapConfig.xml

この状態だとsample2のクラスをロードする時に再度SQLクエリ実行してとってきてくれる。
一度に全部とってこないから最初のクエリははやくなる。
ついでにこいつは2回目のクラスロード時は1回目をキャッシュしてくれてるからSQL実行しない。
エライ!

けど「nullだったら〜」的な条件分岐しているとその分岐には入らない。
EnhancedLazyResultLoaderImplのインスタンスいるからね!当たり前だよね!
(実際ひっかかった。

遅延ローダーOFFにするともちろん全部最初に取ってきてくれるから「nullだったら〜」的な条件でも大丈夫。
ぅーん…基本的に子要素の存在判定はPK的なものがとれるかとれないか、で判定しろって事なのか。

ちなみに遅延ローダーが発行するSQLクエリでException発生したら?と思ってロードの途中でLAN引っこ抜いてみました。
そしたらふつーにSQLException。
画面からローダー使うとか、例外どうしようも出来ない時は落ちちゃうから気をつけないといけないな。。