Интеграция Flyway Spring JPA2 - возможно ли сохранить проверку схемы?

Hy, у меня есть веб-приложение, где я пытаюсь интегрировать JPA2(Hibernate)+Spring+Flyway

Я добавил flyway к своему ApplicationContext следующим образом:

<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
    <property name="baselineOnMigrate" value="true" />
    <property name="dataSource" ref="dataSource" />
</bean>

Теоретически это работает нормально и обновляет схему сценариями, которые я сохраняю в db/igration. Все идет нормально.

Единственная проблема, которая остается для меня, заключается в том, что если я что-то изменю (например, добавлю поле String к сущности), приложение даже не зайдет так далеко, потому что Hibernates Schema-Validator выдаст что-то вроде этого : Причина: org.hibernate.HibernateException: отсутствует столбец: showCaseField в demo.testEntity. Это происходит потому, что я установил для "hibernate.hbm2ddl.auto" значение "validate"

Теперь я читал о том, что Hibernate не распознает действительные схемы perfeclty в некоторых (редких?) Случаях, и я МОГУ (или нет) когда-нибудь достигнуть точки, когда я вообще отключу эту функцию. Но сейчас мне действительно нравится дополнительная проверка, и я не хочу ее отключать.

Можно ли интегрировать Spring и Flyway, сохраняя Hibernates-Schema-Validation? Я предполагаю, что это может быть проблемой, потому что Flyway, вероятно, зависит от компонента DataSource или чего-то еще и в заключение требует полной инициализации applicationContext, что, в свою очередь, предотвращает Hibernate из-за несоответствия схемы.

Есть идеи?

1 ответ

Решение

Нашел ответ сейчас. По сути, все, что вам нужно сделать, это позволить вашему компоненту entityManagerFactory зависеть от вашего компонента Flyway (для этого есть атрибут). Теперь Flyway (и, в свою очередь, ваш источник данных) инициализируется первым, и сценарии Flyway выполняются до проверки схемы Hibernates.

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    depends-on="flyway"> ....
</bean>
<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
    <property name="baselineOnMigrate" value="true"/>
    <property name="dataSource" ref="dataSource"/>
</bean>
Другие вопросы по тегам