2010年1月14日木曜日

hibernate3 no-proxyモード

解釈が間違ってるのかもしれないので、間違ってたらごめんなさい。


hibernateで開発してて


many-to-oneを取得する時の遅延ロードは


デフォルトで lazy=proxyになっている。


この状態で、N対1のNをリストで取得しようとしたときに、


lazyがきかなくて、1のデータを取得するSQLが大量に流れてしまう。


そこでlazy=no-proxyに設定したけど、有効にならないみたい。


いろいろ調べてみると


http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/ja_JP/html/Hibernate_Reference_Guide/Fetching_strategies-Using_lazy_property_fetching.html


あたりで、バイトコード実装(ビルド時にdaoのソースを読み込む?)をAntのタスクで行えば、


no-proxyが有効になり、無駄なデータは取得しないようになった。


build.xmlに、以下のタスクを追加して、compile後に呼んでやった。


 


<target name="build.instrument" depends="build.compile">


<taskdef name="instrument" classname="org.hibernate.tool.instrument.cglib.InstrumentTask">


<classpath refid="build.class.path" />


</taskdef>


<instrument verbose="true">


<fileset dir="${build}/dao">


<include name="*.class"/>


</fileset>


</instrument>


</target>  


 

注意しなくちゃいけないのが、

 


ドキュメントには


classname="org.hibernate.tool.instrument.InstrumentTask"


だがそんなクラスはないので、


 


classname="org.hibernate.tool.instrument.cglib.InstrumentTask"


を指定してやること。

 

 

0 件のコメント:

コメントを投稿