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

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

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

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

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

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

【问题讨论】:

    标签: spring-boot hibernate jpa h2


    【解决方案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


    进一步阅读

    【讨论】:

      【解决方案2】:

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

      @JoinColumn(name = "FLAGCATEGORY_FLAGCATEGORYID")
      

      【讨论】:

      • 谢谢你的回答,其实我知道这个方法。我想要一个答案,它允许我将 hibernate 配置为在自动生成大写的外键列名时使用小写字母,而无需我明确告诉它需要使用哪种情况。如果我使用这种方法,我必须去更改 100 多个模型类。
      猜你喜欢
      • 2012-03-08
      • 2017-09-15
      • 2011-04-25
      • 2016-04-29
      • 1970-01-01
      • 2013-05-10
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多