繁体   English   中英

在OSGI和Hibernate中使用Liquibase

[英]Using Liquibase with OSGI and Hibernate

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

我有另一个可能的想法,可以执行此操作来创建执行更新的附加捆绑包,而其他具有persistence.xml的捆绑包将依赖于此捆绑包。 但是我们有很多与persistence.xml捆绑在一起的东西,这就是为什么BundleTracker解决方案对我来说似乎更好的原因。

在几乎所有情况下,此类依赖项都应建模为服务。 启动/停止捆绑包听起来很容易,但随着时间的流逝,它会让您陷入可怕的可吸入泥潭。

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

因此,在您的情况下,您将创建一个LiquibaseHappy服务或其他东西,并且使用db的捆绑软件应依赖于它。

您也许可以使用最新的pax-jdbc-config来完成此任务。 它从配置中提供数据源服务。 因此,它本身已经是有用的抽象。

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

有关示例,请参见PreHook集成测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM