Hibernate:如何将自动生成的外键列名从小写更改为大写

Posted

技术标签:

【中文标题】Hibernate:如何将自动生成的外键列名从小写更改为大写【英文标题】:Hibernate : How to change the auto generated foreign key column name from lowercase to uppercase 【发布时间】:2020-10-16 16:13:19 【问题描述】:

我正在将旧的 Spring Boot 应用程序迁移到最新的 Spring Boot 2.3.0

迁移成功,但是,当我尝试将应用程序连接到现有数据库时,由于大小写问题,它无法识别自动生成的外键列。

旧版本中的外键列名使用大写字母,如下所示。这里的FLAGCATEGORY_FLAGCATEGORYID是hibernate自动生成的外键列名

当我使用带有 hibernate 5 的新 Spring Boot 版本时,它会生成小写的外键列名。由于这种差异,应用程序无法使用旧数据库启动。有人可以建议我在不更改数据库架构的情况下如何解决这个问题吗?

这是新的外键表名的样子。外键列名现在有小写字母

【问题讨论】:

【参考方案1】:

Hibernate 使用PhysicalNamingStrategy 合约将逻辑名称解析为物理名称。默认实现是简单地使用逻辑名称作为物理名称。

您可以定义自定义实现:

public class FooPhysicalNamingStrategy implements PhysicalNamingStrategy 

    // Changing the column names to upper case
    @Override
    public Identifier toPhysicalColumnName(Identifier identifier,
                                           JdbcEnvironment jdbcEnvironment) 
        
        return jdbcEnvironment
                .getIdentifierHelper()
                .toIdentifier(identifier.getText().toUpperCase(), identifier.isQuoted());
    

    // Keeping as it is
    @Override
    public Identifier toPhysicalSchemaName(Identifier identifier, 
                                           JdbcEnvironment jdbcEnvironment) 
        
        return identifier;
    

    // Other overridden methods    

并将hibernate.physical_naming_strategy设置为类的FQN或者引用类。

例如,将以下属性添加到您的persistence.xml 中的persistence-unit

<property name="hibernate.physical_naming_strategy" value="foo.bar.FooPhysicalNamingStrategy"/>

注意

JPA 内省:

来自Hibernate User Guide:

JPA 没有定义逻辑名称和物理名称之间的分隔。 遵循JPA 规范,逻辑名称 物理名称。如果JPA 提供者的可移植性很重要, 应用程序不应该指定PhysicalNamingStrategy

进一步阅读

Naming Strategies 在 Hibernate 用户指南中

【讨论】:

【参考方案2】:

您可以使用自己的列名而不是自动生成的列名,尝试在您的 flagCategory getter 上添加此注释:

@JoinColumn(name = "FLAGCATEGORY_FLAGCATEGORYID")

【讨论】:

谢谢你的回答,其实我知道这个方法。我想要一个答案,它允许我将 hibernate 配置为在自动生成大写的外键列名时使用小写字母,而无需我明确告诉它需要使用哪种情况。如果我使用这种方法,我必须去更改 100 多个模型类。

以上是关于Hibernate:如何将自动生成的外键列名从小写更改为大写的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate查询带有ID的外键字段

如何使用主键作为JPA和Hibernate的外键引用?

在 Hibernate 中,如何自动检索父 id 并在子插入中将其用作外键?

Hibernate 找不到正确的外键

如何在表 Spring + Hibernate + Spring Security 中填充外键

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增