Liquibase向H2插入数据启动时报表不存在问题求助
排查方案
- 执行顺序冲突(高频原因):如果你的表是通过JPA的
spring.jpa.hibernate.ddl-auto自动生成而非Liquibase创建,Spring Boot默认执行顺序为:Liquibase变更执行 → JPA自动建表。会出现Liquibase执行插入时表还未被JPA创建,执行失败后JPA才完成建表,所以事后可以看到表存在的现象。
修复方案:- 优先将表结构创建逻辑迁移到Liquibase变更集,关闭JPA自动建表:
spring.jpa.hibernate.ddl-auto=none,保证结构变更和数据插入都由Liquibase按顺序执行 - 若必须保留JPA自动建表,可自定义Liquibase Bean依赖于
EntityManagerFactory,强制Liquibase在JPA建表完成后再执行
- 优先将表结构创建逻辑迁移到Liquibase变更集,关闭JPA自动建表:
- Schema匹配错误:检查是否配置了
spring.liquibase.default-schema,该值需要与JDBC连接参数中的schema、建表语句指定的schema完全一致。Liquibase执行插入时会默认使用该配置下的schema查找表,若与表实际所属schema不匹配会触发表不存在错误。而spring.sql.init执行时会直接使用JDBC连接默认的schema,所以不会出现该问题。
修复方案:统一配置Liquibase默认schema和应用数据源的schema,插入语句中的表名可显式指定schema:insert into ${your_schema}.your_table ... - 变更集执行顺序错误:检查插入数据的changeset是否排在建表的changeset之后执行,Liquibase默认按changeset id的字典序+文件顺序执行,若插入变更集的排序早于建表变更集,就会触发错误。
修复方案:调整变更集id顺序保证建表逻辑在前,或给插入变更集添加dependsOn属性显式指定依赖的建表变更集:dependsOn: "create-table-user:zhangsan"(格式为变更集id:变更集作者) - H2标识符大小写敏感问题:H2默认对带双引号的标识符大小写敏感,若建表时使用了带双引号的小写表名
create table "user",Liquibase生成插入语句时未携带双引号,会被H2识别为大写的USER表,触发不存在错误。
修复方案:在JDBC连接参数中添加CASE_INSENSITIVE_IDENTIFIERS=TRUE关闭大小写敏感,或统一变更集中所有表名的大小写和引号规则,与建表语句保持一致。 - Liquibase独立数据源配置错误:检查是否单独配置了
spring.liquibase.url、spring.liquibase.username等独立数据源参数,若参数与应用主数据源不一致,Liquibase会连接到另一个H2实例执行插入,该实例下没有对应表就会报错。
修复方案:删除Liquibase的独立数据源配置,默认共用应用主数据源即可。
内容的提问来源于stack exchange,提问作者DEEPAK MURTHY
相关产品推荐
相关产品推荐

