Spring Boot中Hibernate含数字驼峰转蛇形命名失败问题排查
问题根源与解决方案
你的错误源于自定义命名策略没有处理字母与数字相邻的场景:实体类的驼峰命名(如priceYear2023Eur)转换后,数字和前后字母没有被下划线分隔,变成了price_year2023eur,但数据库实际列名是price_year_2023_eur,导致PostgreSQL无法匹配列名。
正确的自定义命名策略实现
重写命名策略的转换逻辑,在字母与数字、数字与字母的分界处插入下划线,再完成常规的驼峰转蛇形操作:
import org.hibernate.boot.model.naming.Identifier import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy class CustomPhysicalNamingStrategy : SpringPhysicalNamingStrategy() { override fun toPhysicalColumnName(name: Identifier, context: JdbcEnvironment): Identifier { val transformedName = convertToSnakeCase(name.text) return Identifier.toIdentifier(transformedName) } private fun convertToSnakeCase(input: String): String { if (input.isBlank()) return input // 先拆分字母与数字的组合 val numberSeparated = input.replace(Regex("([a-zA-Z])(\\d)"), "$1_$2") .replace(Regex("(\\d)([a-zA-Z])"), "$1_$2") // 处理常规驼峰转蛇形,转小写并去重下划线 return numberSeparated.replace(Regex("([a-z0-9])([A-Z])"), "$1_$2") .lowercase() .replace(Regex("_+"), "_") } }
确认配置正确性
检查application.properties中的命名策略配置是否指向你的自定义类:
spring.jpa.hibernate.naming.physical-strategy=com.your.package.CustomPhysicalNamingStrategy
转换效果验证
经过上述处理,实体类的驼峰名会正确映射到数据库列:
priceYear2023Eur→price_year_2023_eurdateAdded→date_addedyetAnotherColumn2→yet_another_column_2
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

