使用Liquibase与OSGI和Hibernate

时间:2016-11-17 16:52:11

标签: hibernate osgi liquibase blueprint-osgi

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您可以使用最新的pax-jdbc-config执行此任务。它从配置中提供DataSource服务。所以这里的自我已经是一个有用的抽象。

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

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