JHipster执行liquibase:diff重复生成jhi_user唯一约束变更日志问题
问题原因及解决方案
这种重复生成jhi_user表唯一约束删除/重建变更的情况,主要是Liquibase与MySQL在约束识别上的差异导致的,常见原因和对应解决办法如下:
1. 数据库标识符大小写配置问题
MySQL的lower_case_table_names参数会影响表名、约束名的大小写存储:
- 若系统是Windows/macOS,默认该参数为1,会自动将所有标识符转为小写;
- 而JHipster生成的初始变更日志中,唯一约束名是
UC_JHI_USERLOGIN_COL(驼峰/大写格式),数据库中实际存储的是小写的uc_jhi_userlogin_col,Liquibase对比时会判定为两个不同的约束,从而生成删除重建的变更。
解决办法:
- 修改MySQL配置文件,将
lower_case_table_names设置为2(保留标识符大小写,需重启数据库); - 或者手动修改项目初始变更日志中创建
jhi_user表的语句,把uniqueConstraintName改为数据库中实际存在的小写名称,执行liquibase:update同步后,再执行diff就不会重复生成该变更。
2. Liquibase版本兼容性问题
JHipster自带的Liquibase版本可能存在针对MySQL唯一约束对比的逻辑bug,在旧版或测试版JHipster中更易出现。
解决办法:
升级项目中的Liquibase依赖到最新稳定版,比如在pom.xml(Maven)或build.gradle(Gradle)中更新Liquibase的版本号,重新执行liquibase:diff验证问题是否解决。
3. 手动排除特定表的diff检查
如果暂时不想调整配置或依赖,可以在Liquibase配置中排除jhi_user表的diff扫描:
- 在
liquibase.properties或对应的配置文件中添加:excludeObjects=jhi_user - 注意:此方法会忽略
jhi_user表的所有结构变更,若后续需要修改该表结构,需手动编写变更日志。
内容的提问来源于stack exchange,提问作者Nicola Zambon
相关产品推荐
相关产品推荐

