【问题标题】:Using Liquibase with OSGI and Hibernate将 Liquibase 与 OSGI 和 Hibernate 一起使用
【发布时间】:2017-04-01 08:02:59
【问题描述】:

我想将 Liquibase 集成到我的项目中。我的第一个想法是使用从 onInit 方法启动 Liquibase 更新的蓝图 bean。但是休眠存在问题,因为我们将“hbm2ddl.auto”设置为“验证”,并且验证是在我的 bean 的 onInit 之前执行的。 (我们在 META-INF 中使用带有 persistence.xml 的容器管理持久性)。所以我的第二次尝试是使用 BundleTracker,当清单中存在某些条目时,liquibase 会执行数据库更新。它运行良好,但我想强制如果数据库更新不成功,捆绑将不会启动。但我不知道如何从 BundleTracker 方法 addBundle 中做到这一点。有什么方法可以防止从 BundleTracker 事件启动捆绑包?

我有另一个可能的想法是创建一些执行更新的附加包,而其他带有 persistence.xml 的包将取决于这个包。但是我们有很多带有 persistence.xml 的捆绑包,这就是为什么 BundleTracker 的解决方案对我来说似乎更好。

【问题讨论】:

  • 我真的坚持使用 liquibase osgi 和 hibernate 集成我看到你已经找到了一种方法,所以你能帮我吗?因为我想在我的持久性单元和我的数据库之间调用 liquibase 差异作为 osgi 包中的服务,但我不能这样做
  • 我们正在通过 maven 插件进行 diff,但是我们有一个 osgi 包,它能够使用 liquibase 和纯数据源更新数据库。使用 hibernate 时,我们遇到了验证问题,因为它是在我们的 liquibase 更新之前执行的。我认为使用 BundleActivator 您可以在激活休眠之前执行更新,但我们选择了不同的解决方案。

标签: hibernate osgi liquibase blueprint-osgi


【解决方案1】:

您或许可以使用最新的 pax-jdbc-config 来完成此任务。它通过配置提供 DataSource 服务。所以这本身已经是一个有用的抽象。

最新版本现在包含一个名为PreHook 的功能。基本上,您实现了一个 OSGi 服务,该服务实现了 PreHook interface 并使用 name 属性发布它。然后,在您的 DataSource 配置中,您可以通过其名称引用该服务。创建 DataSource 时,会在发布 DataSource 以供其他包使用之前调用此服务。因此,在 PreHook 中,您可以使用 liquibase 处理数据库,并且基于休眠的捆绑软件只会在数据库处于新状态时看到 DataSource。

有关示例,另请参阅integration test for the PreHook

【讨论】:

    【解决方案2】:

    在几乎所有情况下,这些依赖项都应该建模为服务。启动/停止捆绑包可能听起来很容易,但随着时间的推移会让您陷入可怕的可吸泥沼。

    一旦动态依赖成为服务,OSGi 中的所有部分(尤其是声明式服务)都使其动态处理变得微不足道。不仅在“快乐”的情况下,而且在许多方面这些事情都可能导致错误。

    因此,在您的情况下,您创建了一个 LiquibaseHappy 服务或其他东西,并且使用 db 的包应该依赖它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2012-04-12
      • 2021-06-05
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      相关资源
      最近更新 更多