Использование Liquibase с OSGI и Hibernate

Я хотел бы интегрировать Liquibase в мой проект. Моей первой идеей было использование бина проекта, который запускает обновление Liquibase из метода onInit. Но была проблема с hibernate, потому что у нас "hbm2ddl.auto" установлен на "validate", и проверка была выполнена до onInit моего bean-компонента. (мы используем персистентность, управляемую контейнером, с persistence.xml в META-INF). Поэтому моей второй попыткой было использовать BundleTracker, и когда какая-то запись в манифесте существует, liquibase выполняет обновление базы данных. Это работает хорошо, но я хотел бы убедиться, что пакет не запустится, если обновление базы данных не будет успешным. Но я понятия не имею, как это сделать с помощью метода BundleTracker addBundle. Есть ли способ, как предотвратить запуск пакета из события BundleTracker?

У меня есть другая возможная идея сделать это для создания некоторого пакета дополнений, который выполняет обновление, и другой пакет с persistence.xml будет зависеть от этого пакета. Но у нас есть много пакетов с persistence.xml, поэтому решение с BundleTracker мне кажется лучше.

2 ответа

Решение

Почти во всех случаях такого рода зависимости должны быть смоделированы как сервисы. Запуск / остановка связок может показаться легким, но со временем вы попадете в ужасно сосущий болот.

Когда динамическая зависимость - это сервисы, все части OSGi (особенно декларативные сервисы) упрощают работу с его динамикой. Не только в "счастливых" случаях, но и во многих отношениях эти вещи могут вызвать ошибки.

Таким образом, в вашем случае вы создаете сервис LiquibaseHappy или что-то еще, и комплекты, которые используют db, должны зависеть от него.

Возможно, вы сможете использовать новейшую pax-jdbc-config для этой задачи. Он предоставляет сервис DataSource из конфигурации. Так что это само по себе уже полезная абстракция.

Последняя версия теперь содержит функцию под названием PreHook. По сути, вы реализуете сервис OSGi, который реализует интерфейс PreHook, и публикуете его со свойством name. В вашей конфигурации DataSource вы можете ссылаться на эту службу по ее имени. Когда DataSource создан, эта служба вызывается до публикации DataSource для использования другими пакетами. Таким образом, внутри PreHook вы можете работать с базой данных с использованием liquibase, а пакет на основе гибернации будет видеть источник данных только тогда, когда база данных находится в новом состоянии.

Для примера см. Также интеграционный тест для PreHook.

Другие вопросы по тегам