HibernateのLAZYロード中にResultSetがcloseされているというエラー

こちらも、仕事で調べたことのメモ。
HibernateをWebSphereのJTA環境で利用していた際、一部のLAZYロード中に「ResultSetが閉じられています」というエラーを出すことがありました。Hibernate・WebSphere側のトレースを追っていった結果、どうやらHibernateがResultSetの結果をループして処理している最中に、新たにPreparedStatement・ResultSetを発行する処理があり、そのときConnectionを共有していることがわかりました。新たな処理に関するConnectionが閉じられた後、ループ途中のResultSetが閉じられてエラーになっていました。
HibernateJTA環境でのConnectionクローズのタイミングは、デフォルトでは「after_statement」となっており、SQL発行、データ取得処理が終わるたびにcloseされます。どうやら、このstatementが入れ子になったときにConnectionが共有されてしまい、ループの途中でcloseされてしまうみたいです。
確認できていませんが、WebSphereのログを読む限り、WebSphereのDataSourceは各Connection・Statement・ResultSetをラッパーで包み、closeし忘れが無いようにConnectionが閉じられた際にそのConnectionから発行されたStatement・ResultSetを全てcloseするようです。なので、前述のHibernateのような挙動だとエラーになってしまっていました。
HibernateのConnectionリリースモードを、「auto」(デフォルト)から「after_transaction」とすることで、この問題を回避できるようになりました。persistence.xmlのプロパティに

<property name="hibernate.connection.release_mode" value="after_transaction"/>

と書けばOKです。これを定義すると、Hibernateトランザクションの終了時に初めてConnectionをcloseするようになります。
最新のHibernate.3.3でもこのエラーは発生しました。根本はHibernateのConnectionManagerの問題な気がします。statement終了時にConnectionをリリースするようにはなっているけど、statement毎に独立したConnectionを使うようにはなっていないっぽい・・・