Quarkus Dev Services强制Hibernate建表覆盖Flyway配置问题咨询
在test与dev配置环境下使用Quarkus Dev Services启动Postgres数据库,数据库Schema统一由Flyway管理。
启用Dev Services时,Quarkus会自动设置quarkus.hibernate-orm.mddestinationdb.database.generation=drop-and-create,根据项目内定义的实体生成数据库结构。但Flyway脚本定义的库表结构与实体存在差异,例如脚本会新增实体中未定义的列,这类列会被Hibernate自动删除,不符合预期。目标是即使在Dev Services模式下,Hibernate也不自动修改数据库结构。
启动时控制台会打印如下日志:
[io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor] (build-8) Setting quarkus.hibernate-orm.database.generation=drop-and-create to initialize Dev Services managed database
曾尝试显式将该属性设置为none,相关配置如下:
# 该组配置预期让Hibernate不修改现有数据库结构 %dev.quarkus.flyway.schemas=my_schema %dev.quarkus.datasource.devservices.port=5434 %dev.quarkus.flyway.baseline-on-migrate=true %dev.quarkus.flyway..migrate-at-start=true # 显式设置该参数后仍无法关闭Dev Services的自动配置 %dev.quarkus.hibernate-orm.mddestinationdb.database.generation=none
注:上述配置中%dev.quarkus.flyway..migrate-at-start=true多写了一个.属于笔误,修正后依然无法解决自动删表/删列的问题
只需要加一行配置,关闭Hibernate ORM在Dev Services场景下的自动建表触发逻辑即可,不需要修改业务代码,也不会影响Dev Services自动启动Postgres容器的能力:
# 禁止Dev Services启动时自动覆盖Hibernate建表策略 quarkus.hibernate-orm.devservices.enabled=false
之后再针对dev、test环境补全正确的Flyway和Hibernate配置即可:
# dev环境配置 %dev.quarkus.flyway.migrate-at-start=true %dev.quarkus.hibernate-orm.mddestinationdb.database.generation=none # test环境配置 %test.quarkus.flyway.migrate-at-start=true %test.quarkus.hibernate-orm.mddestinationdb.database.generation=none
配置完成后重启应用,控制台不会再出现HibernateOrmProcessor自动设置drop-and-create的日志,数据库结构完全由Flyway脚本管理,不会出现Hibernate删除Flyway新增自定义列的问题。
如果是多数据源场景,注意给每个持久化单元单独配置对应的database.generation=none,同时匹配对应数据源的Flyway启动迁移配置即可。
内容的提问来源于stack exchange,提问作者gucce

