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 并在子插入中将其用作外键?