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

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_eur
  • dateAdded → date_added
  • yetAnotherColumn2 → yet_another_column_2

内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:00:57