web-dev-qa-db-ja.com

FlywayのCDI拡張

HibernateがJBossAS 7.1にフックインする前に、アプリケーションでflywayを実行しようとしました。 @javax.ejb.Startupアノテーションを試してみましたが、Hibernateが初期化され、データベーススキーマがチェックされた後に実行されます。

私が理解している限り、Hibernateが初期化される前にフックするCDI拡張機能を使用できます。フライウェイの箱から出してそれをサポートするものはありますか?そうでない場合、誰かが以前にこれをやろうとしたことがありますか?

21

さて、ついにこれを行う方法を見つけました。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

37

CDIは、アプリケーションの開始/停止時に実行される独自のライフサイクルを定義します。 (すでにそれについて知っているべきではありません: これ は基本的なメカニズムについて学ぶのに良い場所です。)

問題は、私の知る限り、Hibernateの初期化プロセスがCDIの起動に直接リンクされていないことです。これは、HibernateとCDIの「イベント」間の関係に依存しても安全かどうかわからないことを意味します。確かに、CDIイベントHibernateInitializedのようなものはありません。

そうは言っても、試してみます:) BeforeBeanDiscoveryに接続する単純な拡張機能を実装する必要があります。これはできるだけ早く実行されます。

このオンラインプレゼンテーション さまざまなCDIイベントとその順序の概要を説明します。残念ながら、ドイツ語です。

1
jan groth