2016-11-17 5 views
1

Я хотел бы интегрировать Liquibase в свой проект. Моя первая идея состояла в том, чтобы использовать компонент плана, который запускает обновление Liquibase по методу onInit. Но возникла проблема с спящим режимом, потому что у нас есть «hbm2ddl.auto», установленный для «проверки», и проверка была выполнена до того, как он был включен. (мы используем устойчивое управление контейнером с persistence.xml в META-INF). Итак, мой второй подход - использовать BundleTracker, и когда есть какая-либо запись в манифесте, Liquibase выполняет обновление db. Он работает хорошо, но я хотел бы обеспечить, чтобы этот пакет не запускался, если обновление базы данных не будет успешным. Но я не знаю, как это сделать из метода BundleTracker addBundle. Есть ли способ предотвратить запуск пакета из события BundleTracker?Использование Liquibase с OSGI и Hibernate

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

+0

Im действительно застрял в интеграции с libibase osgi и hibernate. Я вижу, что вы уже нашли способ, можете ли вы помочь мне в этом? потому что я хочу вызывать diff linibase между моей единицей сохранения и моей базой данных в качестве службы в пакете osgi, но я не могу этого сделать – elpazio

+0

Мы делаем diff через плагин maven, но у нас есть пакет osgi, который может обновлять базу данных с использованием жидкой жидкости и чистого источника данных. С hibernate у нас была проблема с проверкой, потому что она была выполнена до нашего обновления Liquibase. Я думаю, что с помощью BundleActivator вы можете выполнить обновление до активации спящего режима, но мы выбрали другое решение. – jherkel

ответ

1

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

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

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

1

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

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

Для примера см. Также integration test for the PreHook.

Смежные вопросы