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