Hibernate CamelCaseToUnderscoresNamingStrategy末尾大写字符列映射错误
问题解决:Hibernate 6.2.2 中属性
issueD映射列名异常 问题场景
使用Spring Boot 3.1.0 + Hibernate 6.2.2,无论是否启用如下命名策略配置(或使用默认策略):
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy #spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
实体中定义属性private issueD;(类型按需调整),预期映射数据库列issue_d,但生成的SQL却错误引用r1_0.issued,抛出异常:
ERROR: column r1_0.issued does not exist Hint: Perhaps you meant to reference the column "r1_0.issue_d".
其他属性的列映射均正常,临时处理方式是将属性/列重命名为issuedAt/issued_at。
根本原因
这是Hibernate 6.2.x版本隐式命名策略的特殊处理bug:当属性名以单个大写字母结尾时,Hibernate会直接将该大写字母转为小写并拼接到前半部分,而非按驼峰转下划线规则拆分(即把issueD识别为issue+d,而非issue+D),最终生成issued而非预期的issue_d。
正式解决方案
无需修改属性或列名,直接在实体属性上显式指定列名即可强制映射:
@Column(name = "issue_d") private issueD;
显式配置@Column注解会覆盖Hibernate的隐式命名策略,确保属性与数据库列的映射完全符合预期。
内容的提问来源于stack exchange,提问作者Buks van der Lingen
相关产品推荐
相关产品推荐

