S2Hibernate-JPAでエンティティの自動登録

HibernateEntityManagerには自動でエンティティを見つけてくれる機能があって便利ですが、テストクラスごとに扱うエンティティを変えたい(テストAではHogeエンティティを使うがテストBではHogeエンティティを使いたくない)ときなどには、細かい制御ができなくてちょっと不便な感じがします。
こういう場合は、たぶんテストごとにPersistence Unitを作ってテストクラスでどのPersistence Unitを使うか明示すればいいのだと思いますがpersistence.xmlの記述が増えて面倒くさそうです。persistence.xmlにこのパッケージに属するエンティティ全部対象っていうような指定ができればまだいいのですけど、そういう指定はできなさそうですし。


diconに明示的にエンティティクラスを指定したりパッケージ名だけを指定して自動登録できたりすればきっと楽チンなのかなぁと思います。ということで、S2Containerからエンティティクラスを取得してHibernateに登録する仕組みを作ろうと思います。

方法は、javax.persistence.spi.PersistenceProviderの実装(S2HibernatePersistence)を独自に作って、この中でHibernateがEntityManagerFactoryを生成する前にEjb3ConfigurationにS2Contanerから読み込んだエンティティクラスを登録しちゃうというものです。そして、S2HibernatePersistenceが呼び出されるように、META-INF/services/javax.persistence.spi.PersistenceProviderファイルとpersistence.xmlファイルにS2HibernatePersistenceを使うように記述します。

こうすれば、各テストではテストクラスで必要なエンティティのみをプログラムで登録したり、テスト用のdiconで必要なエンティティのみをパッケージ指定で登録したりできるようになるはず!テストに限らず実環境でも使えると思います。(使いたくなかったらpersistence.xmlを直せばOK)