Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Liquibase与OSGI和Hibernate一起使用_Hibernate_Osgi_Liquibase_Blueprint Osgi - Fatal编程技术网

将Liquibase与OSGI和Hibernate一起使用

将Liquibase与OSGI和Hibernate一起使用,hibernate,osgi,liquibase,blueprint-osgi,Hibernate,Osgi,Liquibase,Blueprint Osgi,我想将Liquibase集成到我的项目中。我的第一个想法是使用blueprint的bean,从onInit方法启动Liquibase更新。但是hibernate有一个问题,因为我们将“hbm2ddl.auto”设置为“validate”,并且验证是在我的bean的onInit之前执行的。(我们在META-INF中使用容器管理的持久性和persistence.xml)。因此,我的第二个尝试是使用BundleTracker,当清单中存在某个条目时,liquibase将执行db更新。它工作得很好,但我

我想将Liquibase集成到我的项目中。我的第一个想法是使用blueprint的bean,从onInit方法启动Liquibase更新。但是hibernate有一个问题,因为我们将“hbm2ddl.auto”设置为“validate”,并且验证是在我的bean的onInit之前执行的。(我们在META-INF中使用容器管理的持久性和persistence.xml)。因此,我的第二个尝试是使用BundleTracker,当清单中存在某个条目时,liquibase将执行db更新。它工作得很好,但我想强制执行,若数据库更新不成功,捆绑包将不会启动。但我不知道如何从BundleTracker方法addBundle中执行此操作。有没有办法防止从BundleTracker事件启动捆绑包


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

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

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


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

您可以使用最新的pax jdbc配置来完成此任务。它通过配置提供数据源服务。因此,它本身已经是一个有用的抽象

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


例如,另请参见。

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