[Seasar2][S2Dao] Hot DeployでS2Daoが使えない件

 先日のHot DeployでS2Daoを動かす件、さらに検証してみたのですが現状のS2DaoはHot Deployに対応していないのではないかという結論に達しました。(追記:間違いでした。) コミッタの方、間違っていたらご指摘ください。以下、調査結果です。

 まず、問題の整理。S2Daoを使ってList型の戻り値で結果を返すメソッドを定義し、これをHot Deploy環境で利用するとListに入ってくるインスタンスのクラスローダと、PageやLogicなどの値を利用する側のクラスローダが異なってClassCastExceptionが発生するというものでした。この問題は1回目の実行時だけはクラスローダが一致するため発生しません。

 この原因は、どうやらDaoMetaDataFactoryImplでDaoMetaDataをキャッシュしているためのようです。1回目の実行時に作られたDaoMetaDataはキャッシュされ2回目以降は、そのインスタンスが使われます。そして、戻り値の元になるBeanClassも一緒にキャッシュされるため、そこからインスタンス化されたクラスとHot Deployによりリクエスト時に作成されたクラスでクラスローダが異なるようです。

 試しに、キャッシュしないようにgetDaoMetaDataの一部をコメントアウトしたところ、動くことは確認できました。もっとも、ソースを全部見たわけではないので、ここ以外にも問題があるかもしれません。