EntityManagerさらに整理

布団の中で、http://d.hatena.ne.jp/nattou_curry_2/20080928/1222606223について考えていたら、気になったので、さらに整理(、というか考察)をしました。

find()にて主キーしか取得できない(キャッシュされない)

最もシンプルなfind()であるEntityManager.find(Class)を呼び出した場合、
その内部でEntityManager.find(Class, String, Query)の呼び出しに到達するまでに、Queryのインスタンスが生成されます。
このとき、Queryのインスタンスの選択項目(field)としては、対象テーブルの主キーのみが指定されます。
したがって、このシンプルなfind()では主キーのみがふくまれ、キャッシュされるのも主キーのみとなります。
そして、後続のEntity.getXXX()において主キー以外の値の取得では、個別にselect文が発行されてしまいます。

そもそものfind()系とget()系の目的に関する推敲

  • find()系 - queryやSQLのwhere句により行を特定すること(主キーを取得すること)。
  • get()系 - 主キーの値から、行エンティティを取得すること。

だから、シンプルなfind()をデフォルトのまま使うと主キー以外のカラムが取得されないもとの思う。
ただし、findWithSQL()を除くfind()については、明示的に指定すれば、主キー以外のカラムも取得できるようです。

find()でほかのカラムも取得するためには

  • 対応1:Queryを明示的に指定できるfind()を使う。
  • 対応2:Preloadアノテーションを指定して、find()を使う。

最後に

上記の対応を行えば、getXXX()においても、個別にselectが発行されることはないと思われます。



以上、ソースを読んだ結果からそれっぽいことを書いてみました。(ようするに動かしていない)