persistence.xmlを読み込んでテーブルを作成する

Hibernateでは起動時に自動的にテーブルが作成されるが、それを手動で実行する方法のメモ。

Hibernateでのテーブル作成には、SchemaUpdateというクラスを利用すれば良いが、これにはConfigurationという設定クラスを渡す必要がある。起動時にHibernateが構築したものがあるはずなので、これを取得できれば良いのだけれど、残念ながら外部から取り出す方法は見当たらない。

代わりに、自力で設定ファイルを読み込んでConfigurationを作成する方法を試してみた。JPAでpersistence.xmlを利用する方法の情報はあまり見当たらないが、Ejb3Configurationというクラスを使った例を見つけることが出来た。見つかったコード例そのままでは動かなかったのだけれど、ソースコードを眺めたりしてこんな感じのコードにしたら無事に動かすことができた。

// META-INF/persistence.xml を読み込んでConfigurationを作成する。
// DefaultPersistenceUnitの部分は実際の値に変更が必要
Ejb3Configuration ejb3Cfg = new Ejb3Configuration();
ejb3Cfg.configure("DefaultPersistenceUnit", new HashMap());
Configuration cfg = ejb3Cfg.getHibernateConfiguration();

SchemaUpdate update = new SchemaUpdate(cfg);
update.execute(true, true);

ちなみに最初に試した時はうまく動かなくて悩んでしまったが、単に設定ファイルの置き場所が悪いだけだった。設定ファイルの場所がMETA-INF/persistence.xmlとハードコーディングされているので、JPAの仕様に合わせてMETA-INF/persistence.xmlに置いておく必要がある。

それとこの方法では起動時にHibernateが構築した情報は利用されないため、エンティティの自動検出を利用していると、Configurationの構築時に再びエンティティの探索が行われてしまいます。開発時に毎回データベースの作成(更新チェック)を行うと無駄だなぁと思って調べてみたのだけれど、結局エンティティの探索が遅いのであまり意味がないという悲しい結果になってしまいました。