Spring Boot+H2中globally_quoted_identifiers配置未生效问题咨询
解决Spring Boot+H2+Liquibase的SQL关键字冲突问题
问题根源
你配置的hibernate.globally_quoted_identifiers=true只对Hibernate自动生成的SQL生效,但Liquibase执行的初始化脚本是独立运行的,不受这个配置管控,所以Liquibase里的关键字列名还是会触发语法错误。
完整解决方案
要实现全局关键字管理,需要同时处理Hibernate和Liquibase两部分:
1. 确保Hibernate的全局引号配置生效
你的现有配置是正确的,保持即可:
spring: jpa: properties: hibernate: globally_quoted_identifiers: true
注意:如果使用了原生SQL查询,里面的关键字列名需要手动加双引号,比如SELECT "VALUE" FROM table,Hibernate不会自动处理原生查询里的标识符。
2. 让Liquibase自动引号所有标识符
在Spring Boot配置里添加Liquibase的全局引号配置,这样它执行初始化脚本时会自动给所有表名、列名加上引号:
spring: liquibase: quote-all-identifiers: true
如果你的Liquibase版本较低(低于4.5),这个属性可能不支持,此时可以在changelog文件里给冲突的列手动加引号:
<!-- 方式1:直接给列名加双引号 --> <column name="\"VALUE\"" type="VARCHAR(255)"/> <!-- 方式2:使用quoted属性 --> <column name="VALUE" type="VARCHAR(255)" quoted="true"/>
3. 替代方案:全局配置H2的非关键字
如果暂时不想改Liquibase脚本,也可以在H2的URL里全局配置非关键字,比临时的NON_KEYWORDS更持久:
spring: datasource: url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;NON_KEYWORDS=VALUE,KEY
不过这种方式只针对H2数据库,换数据库时需要调整,不如全局加引号通用。
内容的提问来源于stack exchange,提问作者phildeg31
相关产品推荐
相关产品推荐

