Интеграция Flyway в JPA + OSGi
В моем текущем проекте я интегрировал 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. Сценарии переноса БД должны быть упакованы непосредственно в пакет сохраняемости. Теперь я хотел бы инициировать миграцию именно тогда, когда создается DataSource, непосредственно перед регистрацией служб EntityManagerFactory и EntityManagerFactoryBuilder. В этот момент у меня должен быть доступ к загрузчику классов Persistence Bundle, и у меня должен быть инициализированный источник данных. Единственное решение, которое я нашел, - это рефакторинг JPA-контейнера Apache Areas и размещение вызова миграции 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 Container.
Есть ли другое, более совершенное и подтверждающее спецификации решение для интеграции Flyway в мой проект?
1 ответ
Чтобы подключиться к созданию источника данных, вы можете использовать сервис PreHook, как описано в документации по pax-jdbc.
Вы можете найти пример здесь.
@Component(property="name=persondb")
public class Migrator implements PreHook {
public void prepare(DataSource ds) throws SQLException {
// Put your migration calls here
}
}