EntityManagerさらに整理
布団の中で、http://d.hatena.ne.jp/nattou_curry_2/20080928/1222606223について考えていたら、気になったので、さらに整理(、というか考察)をしました。
find()にて主キーしか取得できない(キャッシュされない)
最もシンプルなfind()であるEntityManager.find(Class
その内部でEntityManager.find(Class
このとき、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が発行されることはないと思われます。
以上、ソースを読んだ結果からそれっぽいことを書いてみました。(ようするに動かしていない)