spring 使用Sping Boot 命名Hibernate字段

bakd9h0s  于 2023-08-02  发布在  Spring
关注(0)|答案(3)|浏览(126)

在我的表中,我有如下名称的列:price_year_2023_eurdate_addedyet_another_column_2,…。在kotlin端,我希望能够使用camelCase列名。因此,我正在尝试转换列名称。

// kotlin
@Entity
@Table(name = "foo")
class Project(
    @Column var priceYear2023Eur : String = "",
    @Column var dateAdded: Int = 1,
    @Column var name: String = "",
    @Column var yetAnotherColumn2: Double = 0.0,
)

字符串
我创建了一个类(基于此),其中扩展了convertToSnakeCase()以包含数字。

class CustomPhysicalNamingStrategy {
    fun toPhysicalCatalogName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
        return convertToSnakeCase(identifier)
    }

    fun toPhysicalColumnName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
        return convertToSnakeCase(identifier)
    }

    fun toPhysicalSchemaName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
        return convertToSnakeCase(identifier)
    }

    fun toPhysicalSequenceName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
        return convertToSnakeCase(identifier)
    }

    fun toPhysicalTableName(identifier: Identifier, jdbcEnv: JdbcEnvironment?): Identifier? {
        return convertToSnakeCase(identifier)
    }

    private fun convertToSnakeCase(identifier: Identifier): Identifier? {
        val regexCamelCase = "([a-z])([A-Z])".toRegex()
        val regexNumber = """([a-zA-Z])(\d)""".toRegex()
        val replacement = "$1_$2"
        val newNameLetters: String = identifier.text
            .replace(regexCamelCase, replacement)
            .lowercase()
        val newNameNumbers: String = newNameLetters
            .replace(regexNumber, replacement)
            .lowercase()
        return Identifier.toIdentifier(newNameNumbers)
    }
}


我添加到application.properties文件中的这个类如下所示

hibernate.physical_naming_strategy=org....utils.CustomPhysicalNamingStrategy


但是我得到了
org.postgresql.util.PSQLException:您访问的页面不存在!也许你想引用列“p1_0.price_year_2023_eur”。
有些东西是不工作的转换,我不确定为什么。

2w2cym1i

2w2cym1i1#

如果你正在使用Hibernate,那么你可以使用@Column注解的name属性,就像你在@Table中做的那样。例如,在

@Column(name = "year_2022_green")
var year2022Green: String = "";

字符串

e7arh2l6

e7arh2l62#

如果你想从camelCase转换为snake_case,你必须设置:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

字符串
如果你想使用你自己的:

spring.jpa.hibernate.physical_naming_strategy=org....utils.CustomPhysicalNamingStrategy

请不要在 hibernate 前有spring.jpa...

最后,CustomPhysicalNamingStrategy必须从Hibernate实现PhysicalNamingStrategy

o2g1uqev

o2g1uqev3#

有两个问题。在Sping Boot 3和Hibernate 6中,application.properties必须如下所示

spring.jpa.hibernate.naming.physical-strategy=<path>.CustomPhysicalNamingStrategy

字符串
请注意,physical-strategy 使用CustomPhysicalNamingStrategy,而不是附带的CamelCaseToUnderscoresNamingStrategy

相关问题