0

在我当前的项目中,我已将 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 集成到我的项目中?

4

1 回答 1

0

要挂钩数据源创建,您可以使用pax-jdbc 文档中描述的 PreHook 服务。

你可以在这里找到一个例子

@Component(property="name=persondb")
public class Migrator implements PreHook {
    public void prepare(DataSource ds) throws SQLException {
        // Put your migration calls here
    }
}
于 2018-05-28T12:17:07.533 回答