Flyway 与 JPA + OSGi 的集成

Posted

技术标签:

【中文标题】Flyway 与 JPA + OSGi 的集成【英文标题】:Integration of Flyway into JPA + OSGi 【发布时间】:2018-11-07 00:18:36 【问题描述】:

在我当前的项目中,我已将 JPA 集成到 OSGi 独立应用程序中。对于集成,我采用了以下 OSGi 规范实现:

OSGi R7 平台 (Equinox 3.13.0) JPA 2.2 (Eclipselink 2.7.1) JPA 容器 Apache Aries JPA 容器 2.7.0 Apache Aries JPA Eclipselink 适配器 2.7.0 JDBC 服务 (PAX JDBC MariaDB 1.3.0)

这种集成效果很好。

下一步 - Flyway 集成。数据库迁移脚本应该直接打包到 Persistence Bundle 中。现在我想在创建 DataSource 时准确地触发迁移,就在 EntityManagerFactory 和 EntityManagerFactoryBuilder 服务将被注册之前。此时我应该可以访问 Persistence Bundle 类加载器,并且我应该有一个初始化的数据源。我发现的唯一解决方案是重构 Apache Areas JPA 容器并将 Flyway 迁移调用放入 AriesEntityManagerFactoryBuilder.dataSourceReady。 Flyway 触发器存储为 JPA 属性中的位置,如下所示:

    <property name="org.flywaydb.Locations" value="classpath:com/hrrm/budget/domain/account/migrations"/>

这个解决方案是正确放置在一个完美的调用时间。但它并未与 OSGi JPA 服务规范 1.1 确认,而是作为挂钩实现到 Apache Aries JPA 容器中。

还有其他更完美且符合规范的解决方案可以将 Flyway 集成到我的项目中吗?

【问题讨论】:

【参考方案1】:

要挂钩 DataSource 创建,您可以使用 PreHook 服务,如 pax-jdbc docs 中所述。

您可以找到example here。

@Component(property="name=persondb")
public class Migrator implements PreHook 
    public void prepare(DataSource ds) throws SQLException 
        // Put your migration calls here
    

【讨论】:

感谢您的建议。我已经检查过这个解决方案,它看起来不错,但我不知道这个数据源属于哪个持久性单元。这个信息对我来说很重要,我知道应该开始哪个迁移。但是非常感谢 您可以为钩子定义一个名称并在 DS 定义中引用它。因此,您可以通过这种方式将某个 hook impl 链接到某个 DS。

以上是关于Flyway 与 JPA + OSGi 的集成的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot - Flyway - JPA 集成 - 创建名称为“flywayInitializer”的 bean 时出错 - information_schema 中的未知表“事件”

JPA 与 OSGi 示例在 serviceReference 中返回 null

JPA 与 OSGi DS 示例

在有或没有 OSGi 的情况下使用 JPA 的区别

Spring Boot Jpa 批处理-CannotCreateTransactionException

在 JPA 中使用 Flyway 创建的序列