将 Liquibase 与 OSGI 和 Hibernate 结合使用
Using Liquibase with OSGI and Hibernate
我想将 Liquibase 集成到我的项目中。我的第一个想法是使用蓝图的 bean 从 onInit 方法启动 Liquibase 更新。但是休眠有问题,因为我们将 "hbm2ddl.auto" 设置为 "validate" 并且在我的 bean 的 onInit 之前执行了验证。 (我们在 META-INF 中使用 persistence.xml 的容器管理持久性)。所以我的第二次尝试是使用 BundleTracker,当清单中的某些条目存在时,liquibase 会执行数据库更新。它运行良好,但我想强制执行如果数据库更新不成功,则捆绑包不会启动。但是我不知道如何从 BundleTracker 方法 addBundle 中做到这一点。有什么办法可以防止从 BundleTracker 事件中启动捆绑包吗?
我有另一个可能的想法是创建一些执行更新的附加捆绑包,而其他带有 persistence.xml 的捆绑包将取决于此捆绑包。但是我们有很多 persistence.xml 的捆绑包,这就是为什么 BundleTracker 的解决方案对我来说似乎更好。
在几乎所有情况下,此类依赖关系都应建模为服务。 Starting/stopping 捆绑包听起来很简单,但随着时间的推移会让您陷入可怕的泥潭。
一旦动态依赖项成为服务,OSGi 中的所有部分(尤其是声明式服务)都使其动态处理变得微不足道。不仅在 'happy' 情况下,而且在许多方面这些事情都可能导致错误。
所以在你的情况下,你创建了一个 LiquibaseHappy 服务或其他东西,使用数据库的包应该依赖于它。
您可以使用最新的 pax-jdbc-config 来完成这项任务。它从配置中提供数据源服务。所以这本身就是一个有用的抽象。
最新版本现在包含一个名为 PreHook. Basically you implement an OSGi service that implements the PreHook interface 的功能,并以 属性 的名称发布。在您的 DataSource 配置中,您可以通过其名称引用该服务。创建 DataSource 时,将在发布 DataSource 供其他包使用之前调用此服务。因此,在 PreHook 内部,您可以使用 liquibase 处理数据库,而基于 hibernate 的捆绑包只会在数据库处于新状态时看到数据源。
有关示例,另请参阅 integration test for the PreHook。
我想将 Liquibase 集成到我的项目中。我的第一个想法是使用蓝图的 bean 从 onInit 方法启动 Liquibase 更新。但是休眠有问题,因为我们将 "hbm2ddl.auto" 设置为 "validate" 并且在我的 bean 的 onInit 之前执行了验证。 (我们在 META-INF 中使用 persistence.xml 的容器管理持久性)。所以我的第二次尝试是使用 BundleTracker,当清单中的某些条目存在时,liquibase 会执行数据库更新。它运行良好,但我想强制执行如果数据库更新不成功,则捆绑包不会启动。但是我不知道如何从 BundleTracker 方法 addBundle 中做到这一点。有什么办法可以防止从 BundleTracker 事件中启动捆绑包吗?
我有另一个可能的想法是创建一些执行更新的附加捆绑包,而其他带有 persistence.xml 的捆绑包将取决于此捆绑包。但是我们有很多 persistence.xml 的捆绑包,这就是为什么 BundleTracker 的解决方案对我来说似乎更好。
在几乎所有情况下,此类依赖关系都应建模为服务。 Starting/stopping 捆绑包听起来很简单,但随着时间的推移会让您陷入可怕的泥潭。
一旦动态依赖项成为服务,OSGi 中的所有部分(尤其是声明式服务)都使其动态处理变得微不足道。不仅在 'happy' 情况下,而且在许多方面这些事情都可能导致错误。
所以在你的情况下,你创建了一个 LiquibaseHappy 服务或其他东西,使用数据库的包应该依赖于它。
您可以使用最新的 pax-jdbc-config 来完成这项任务。它从配置中提供数据源服务。所以这本身就是一个有用的抽象。
最新版本现在包含一个名为 PreHook. Basically you implement an OSGi service that implements the PreHook interface 的功能,并以 属性 的名称发布。在您的 DataSource 配置中,您可以通过其名称引用该服务。创建 DataSource 时,将在发布 DataSource 供其他包使用之前调用此服务。因此,在 PreHook 内部,您可以使用 liquibase 处理数据库,而基于 hibernate 的捆绑包只会在数据库处于新状态时看到数据源。
有关示例,另请参阅 integration test for the PreHook。