Интеграция 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>