2016-11-17 1 views
1

プロジェクトにLiquibaseを統合したいと思います。私の最初のアイデアは、onInitメソッドからLiquibase更新を開始する青写真のBeanを使用することでした。しかし、 "hbm2ddl.auto"が "validate"に設定され、検証が私のbeanのonInitの前に実行されているため、休止状態に問題がありました。 (META-INFのpersistence.xmlでコンテナ管理の永続性を使用します)。だから私の2番目の試みはBundleTrackerを使うことでした。マニフェストのエントリがあると、liquibaseはdbの更新を行います。うまくいっていますが、データベースの更新がうまくいかないとバンドルが開始されないように強制したいと思います。しかし、私はBundleTrackerのメソッドaddBundleからそれをどうやって行うのか分かりません。 BundleTrackerイベントからバンドルを起動できないようにする方法はありますか?OSGIと休止状態でのLiquibaseの使用

更新を実行するいくつかの追加バンドルを作成し、persistence.xmlで他のバンドルを作成する方法は、このバンドルに依存するという考え方もあります。しかし、BundleTrackerを使った解決策が私にとってより良いように見えるのは、persistence.xmlのバンドルがたくさんあります。

+0

本当に私はliquibase osgiと冬眠の統合に固執しています。私はあなたがすでにその方法を見つけたことを知っています。 osgiバンドルのサービスとして私の永続性ユニットと私のデータベースとの間でliquibase diffを実行したいのですが、私はそれを行うことができません – elpazio

+0

私たちはmavenプラグイン経由でdiffを行っていますが、データベースを更新できるosgiバンドルliquibaseと純粋なデータソースを使用します。 hibernateを使うと、私たちはliquibase更新の前に実行されたので、検証に問題がありました。私は、BundleActivatorを使用して、Hibernateがアクティブになる前にアップデートを実行できると思いますが、私たちは別のソリューションを選択しました。 – jherkel

答えて

1

ほとんどの場合、これらの依存関係はサービスとしてモデル化する必要があります。バンドルの起動/停止は簡単に聞こえるかもしれませんが、時間の経過とともに恐ろしいほどに邪魔になることがあります。

動的依存関係がサービスであると、OSGiのすべての部分(特に宣言型サービス)は、そのダイナミクスを扱うのが簡単です。 「幸せな」ケースだけでなく、さまざまなやり方でこれらのことがエラーを引き起こす可能性があります。

あなたのケースでは、LiquibaseHappyサービスなどを作成し、dbを使用するバンドルはそれに依存する必要があります。

1

このタスクでは、最新のpax-jdbc-configを使用できます。これは、構成からDataSourceサービスを提供します。だから、これ自体はすでに、有用な抽象化である。

最新のバージョンにはPreHookという機能が追加されました。基本的にはPreHook interfaceを実装するOSGiサービスを実装し、それをnameプロパティで公開します。 DataSource設定では、その名前でそのサービスを参照できます。 DataSourceが作成されると、このサービスは他のバンドルで使用するためにDataSourceが公開される前に呼び出されます。 PreHookの内部では、liquibaseを使ってデータベースを操作することができ、データベースが新しい状態になっているときにのみ、HibernateベースのバンドルにはDataSourceが表示されます。

例については、integration test for the PreHookも参照してください。