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
相关产品推荐
相关产品推荐

