HibernateがJBossAS 7.1にフックインする前に、アプリケーションでflywayを実行しようとしました。 @javax.ejb.Startup
アノテーションを試してみましたが、Hibernateが初期化され、データベーススキーマがチェックされた後に実行されます。
私が理解している限り、Hibernateが初期化される前にフックするCDI拡張機能を使用できます。フライウェイの箱から出してそれをサポートするものはありますか?そうでない場合、誰かが以前にこれをやろうとしたことがありますか?
さて、ついにこれを行う方法を見つけました。HibernateIntegrationAPIを使用する必要がありました。これは私が書かなければならなかったコード全体です:
public class FlywayIntegrator implements Integrator {
@Override
public void integrate(final Configuration configuration, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
final Flyway flyway = new Flyway();
flyway.setDataSource(....);
flyway.migrate();
}
@Override
public void integrate(final MetadataImplementor metadataImplementor, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
//no-op
}
@Override
public void disintegrate(final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
//no-op
}
}
誰かがより詳細に興味があるなら、私はそれを示すgithubプロジェクトを作成しました: https://github.com/dobermai/Hibernate-Flyway-Integration
CDIは、アプリケーションの開始/停止時に実行される独自のライフサイクルを定義します。 (すでにそれについて知っているべきではありません: これ は基本的なメカニズムについて学ぶのに良い場所です。)
問題は、私の知る限り、Hibernateの初期化プロセスがCDIの起動に直接リンクされていないことです。これは、HibernateとCDIの「イベント」間の関係に依存しても安全かどうかわからないことを意味します。確かに、CDIイベントHibernateInitialized
のようなものはありません。
そうは言っても、試してみます:) BeforeBeanDiscovery
に接続する単純な拡張機能を実装する必要があります。これはできるだけ早く実行されます。
このオンラインプレゼンテーション さまざまなCDIイベントとその順序の概要を説明します。残念ながら、ドイツ語です。