S2TopLink-JPA開発日記 N:1LAZYロード対応

この件について色々悩んでいたのですが、結局JUnit単体テストを動かすときには、どの方法を使ってもうまく動かないことが判明・・・これはTopLink Essentials本来の方式(javaagent)でも同様です。JUnitがテストケースのクラスをロードするときに、Entityクラスをロードしてしまったらその時点でアウトなのですが、JUnit自体はEclipseで動かしたり、AntやMavenで動かしたりと様々な起動のされ方をするので、ここに対して対処を考えるのは難しいのではないかと思います。あと、mainメソッド内でS2Containerを呼び出して、同一メソッド内でEntityを扱うクラスを呼び出すような記述をするときも、PersistenceUnitInfoによる対処は難しい・・・結局、基本はPersistenceクラスを利用する方法で、N:1LAZYロードについては、クライアントアプリのときはjavaagent、Tomcat等Appサーバ上で動かすときだけPersistenceUnitInfoを利用するようにしようと思います。
制限としては、Appサーバ上では、ComponentAutoRegisterなどを使って自動登録を行った場合のみ、N:1LAZYロードを有効とすることができます。diconファイルにEntityを使うクラスを直接記述した場合、EntityManagerFactoryを初期化する前にClassがロードされてしまうので利用できません。またJUnit単体テストを動かすときは、TopLinkでN:1LAZYロードは利用できません(javaagentを使えば、1個のテストに対してのみ有効になりますが、2個以上のテストを連続して実行できない為)。Appサーバ上でN:1LAZYロードを利用するときのみ、専用のjpa.diconをクラスパスに追加します。利用しないときには、jpa.diconはs2tiger標準のものを利用するので必要ありません。
・・・さて・・・、となると、PersistenceUnitInfoを利用する場面はかなり限られてしまうので、このクラスを当てにした拡張はあまり考えない方がよさそうですね。結局、機能拡張については独自PersistenceProviderを作成する方向に落ち着きそうですが、TopLink側の問題(別のPersistenceProviderを指定しても無視して、無理やりEntityManagerFactoryを作成しようとしてエラーになる)が解決するまでは保留なのかな?・・・いや、取りあえずPersistenceクラスの代替クラスを作って、上記問題が発生しないようにすればいいのか・・・