22

ハイバネートが JBoss AS 7.1 に接続する前に、アプリケーションで flyway を実行しようとしました。注釈を付けてみました@javax.ejb.Startupが、Hibernate が初期化され、データベース スキームがチェックされた後に実行されます。

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

4

2 に答える 2

38

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

于 2012-07-19T09:57:20.977 に答える
1

CDI は、アプリケーションの起動/停止時に実行される独自のライフサイクルを定義します。(もうご存知ではないでしょうか。基本的な仕組みを学ぶのに適した場所です。

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

そうは言っても、試してみます:) に接続する簡単な拡張機能を実装する必要BeforeBeanDiscoveryがあります。

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

于 2012-06-18T20:17:53.783 に答える