Flyway Spring JPA2 集成 - 可以保持模式验证吗?
Posted
技术标签:
【中文标题】Flyway Spring JPA2 集成 - 可以保持模式验证吗?【英文标题】:Flyway Spring JPA2 integration - possible to keep schema validation? 【发布时间】:2016-08-28 10:49:56 【问题描述】:嗨,我有一个 Web 应用程序,我正在尝试集成 JPA2(Hibernate)+Spring+Flyway
我像这样在我的 ApplicationContext 中添加了 flyway:
<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
<property name="baselineOnMigrate" value="true" />
<property name="dataSource" ref="dataSource" />
</bean>
理论上这可以正常工作,并使用我保存在 db/migration 下的脚本更新架构。到目前为止一切顺利。
留给我的一个问题是,如果我更改某些内容(例如,将字符串字段添加到实体),应用程序甚至不会走到这一步,因为 Hibernates Schema-Validator 会抛出如下内容:原因:org.hibernate.HibernateException:缺少列:demo.testEntity 中的 showCaseField。发生这种情况是因为我已将“hibernate.hbm2ddl.auto”设置为“验证”
现在我读到了 Hibernate 在某些(罕见?)情况下无法识别完美有效模式的信息,并且我可能(或不)有一天会完全禁用此功能。但截至目前,我实际上喜欢额外验证并且不想将其关闭。
是否可以在保持 Hibernates-Schema-Validation 的同时集成 Spring 和 Flyway?我想这可能是个问题,因为 Flyway 可能依赖于 DataSource-bean 或其他东西,总之要求 applicationContext 完全初始化,这反过来又因模式不匹配而阻止 Hibernate..
有什么想法吗?
【问题讨论】:
【参考方案1】:现在找到答案了。基本上你所要做的就是让你的 entityManagerFactory-bean 依赖你的 Flyway bean(有一个属性)。现在 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>
【讨论】:
以上是关于Flyway Spring JPA2 集成 - 可以保持模式验证吗?的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot 和 Flyway:集成测试前清除数据库数据
Flyway 与 Spring Boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本