Интеграция 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
    }
}
Другие вопросы по тегам