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

Spring Boot+Flyway+HSQLDB:如何保留表与列名的小写定义?

解决HSQLDB中Flyway与Hibernate标识符大小写不一致问题

这个问题我之前也碰到过,本质是HSQLDB的默认行为在搞鬼——它会把未特殊处理的标识符自动转成大写,再加上Hibernate的默认命名策略,就导致最终生成的表/列名和你脚本、实体里的定义完全不一样了。下面是分步解决的方案:

1. 修改HSQLDB连接参数,保留标识符原大小写

在Spring Boot的配置文件(application.properties或application.yml)里,给HSQLDB的连接URL添加sql.identifier_case=preserve参数:

spring.datasource.url=jdbc:hsqldb:file:./your/db/path;sql.identifier_case=preserve

这个参数会让HSQLDB彻底放弃自动转大写的操作,完全保留你在SQL脚本里写的标识符大小写。

2. 配置Hibernate物理命名策略,禁用自动转换

默认情况下Hibernate会对实体类指定的表/列名做额外转换(比如驼峰转下划线之类的),我们需要强制它严格遵循实体里的定义:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

这个策略会完全照搬你在@Table(name = "tbl_role")和@Column注解里写的名称,不会做任何多余处理。

3. 清理旧表并重新执行Flyway迁移

如果之前已经生成了大写的表(比如TBL_ROLE),得先把这些旧表清理掉:

  • 开发环境可以直接删除HSQLDB的数据库文件(文件模式下)
  • 或者通过HSQLDB控制台手动删除已存在的大写表
  • 也可以用Flyway的clean命令清空所有迁移生成的对象(注意:会删除所有数据,仅适合开发环境)

做完这些后重启应用,Flyway会生成和脚本定义完全一致的表名/列名,Hibernate也能正确映射到这些对象了。

补充说明

你之前尝试用双引号包裹标识符没生效,是因为HSQLDB默认的sql.identifier_case=upper规则下,未加引号的标识符会被转大写,但加引号的会保留大小写——不过结合上面的参数配置后,完全不需要再用引号包裹,脚本可以保持原来简洁的写法。

内容的提问来源于stack exchange,提问作者max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:27:34