Интеграция Flyway в JPA + OSGi - PullRequest
0 голосов
/ 28 мая 2018

В моем текущем проекте я интегрировал 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.

Есть ли еще более совершенное и подтверждающее спецификации решение для интеграции Flyway в мой проект?

1 Ответ

0 голосов
/ 28 мая 2018

Чтобы подключиться к созданию источника данных, вы можете использовать сервис PreHook, как описано в pax-jdbc документах .

Вы можете найти пример здесь .

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