You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot H2内存库执行data.sql时表名大小写不匹配报错

问题原因

两个配置冲突导致表名大小写匹配失败:

  1. 配置项spring.jpa.properties.hibernate.globally_quoted_identifiers=true会让Hibernate生成的建表语句给所有表名、字段名加双引号,H2数据库中被双引号包裹的标识符是严格大小写敏感的,最终创建出来的表名是固定小写的"activity_domain"。
  2. data-test.sql里的INSERT语句表名没有加双引号,H2处理未被双引号包裹的标识符时,会按配置做大小写转换,当前URL里的DATABASE_TO_UPPER=false参数没有对齐转换规则,最终H2把表名转为大写ACTIVITY_DOMAIN去查表,和已存在的小写表名不匹配,抛出找不到表的异常。
可选解决方案

根据实际场景选一个即可:

  • 推荐方案:关闭test环境的全局标识符引号配置
    测试环境使用H2不需要适配数据库保留字场景,直接在test环境的配置文件中将该参数设为false即可,Hibernate建表时不会再给标识符加双引号,H2会按统一规则处理表名大小写,和初始化脚本的无引号表名自动匹配。
    spring.jpa.properties.hibernate.globally_quoted_identifiers=false
    
  • 保留全局引号配置的方案:统一初始化脚本的标识符格式
    如果必须保留globally_quoted_identifiers=true的配置,给data-test.sql里所有表名、字段名加上双引号,严格使用和Hibernate建表一致的小写名称即可:
    INSERT INTO "activity_domain" (title) VALUES ('Activity Domain One');
    
  • 调整H2连接参数方案:统一大小写转换规则
    高版本H2推荐用DATABASE_TO_LOWER参数替代旧的DATABASE_TO_UPPER配置,修改JDBC URL让H2把所有未加引号的标识符统一转成小写,和Hibernate创建的小写表名对齐:
    spring.datasource.url=jdbc:h2:mem:my-test-db;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1
    

避坑提示:不要在SQL中混用带双引号和不带双引号的标识符,跨环境部署时尽量把数据库相关的差异化配置放到对应profile的配置文件中,避免公共配置带来的环境适配问题。

内容的提问来源于stack exchange,提问作者Ali Behzadian Nejad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:57:14