休眠列名问题

Posted

技术标签:

【中文标题】休眠列名问题【英文标题】:hibernate column name issues 【发布时间】:2010-09-27 10:14:42 【问题描述】:
@Column(name="DateOfBirth")
private Date dateOfBirth;

我特别需要上面的代码来创建一个名为“DateOfBirth”的列,而不是 Hibernate 给我一个名为 date_of_birth 的列。我怎样才能改变这个?有 web.xml 属性吗?我遇到了 DefaultNamingStrategy 和 ImprovementNamingStrategy,但不确定如何指定其中一个。

【问题讨论】:

可能的工作。如果您将其命名为 dateofbirth,则数据库中的列将被命名,但属性名称应该相同。 那么让我把它作为答案:) 【参考方案1】:

在 spring boot 的情况下添加下面的属性。

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

【讨论】:

这曾经可以工作,但由于 spring-boot 2 (2.0.4) 和 hibernate 5.2 (5.2.17) 它不再工作了。我调试了整个hibernate,命名策略实际上并没有干扰,但是之后一些其他的hibernate魔法进行了转换以将下划线添加到camlCase属性。这真的很糟糕,尤其是显式的 @Column(name="nameWithCamlCase") 没有帮助,而且 hibernate 仍然认为比开发人员想要的更聪明。我认为一些最新的 JPA 合规性问题导致了这种疯狂。【参考方案2】:

试着把它放进去

application.properties

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

【讨论】:

【参考方案3】:

这是一种可能的解决方法:如果您将其命名为 dateofbirth,则 DB 中的列将这样命名,但属性名称应该相同。

Hibernate 采用驼峰式格式创建/读取数据库列。

我以前遇到过这个问题。我使用了一个遗留列,其中列名“employeename”、“employeerole”、“departmentlocation”中没有空格。我讨厌它,因为我所有的 bean 属性都必须没有驼峰式。

如您所见,以“_”分隔的数据库列将用于正确的驼峰式命名。

【讨论】:

【参考方案4】:

仅供参考:插入下划线的原因可能是因为您使用的是ImprovedNamingStrategy。它设置在您的 Configuration 对象上。示例见here...

如果您不想要下划线,您可以不设置命名策略,或者将其设置为您之前发现的 DefaultNamingStrategy。

【讨论】:

这正是导致此问题的原因。对我来说就像一个魅力。 谢谢,这对我很有帮助。你能建议任何链接来看看我在使用 DefaultNamingStrategy 而不是改进的一个时会丢失什么吗?【参考方案5】:

ImprovedNamingStrategy 具有方法 addUnderscores(),该方法从 tableName() 和 columnName() 调用 您可以实现自己的命名策略类并根据您的选择覆盖它们

    public class MyOwnNamingStrategy extends ImprovedNamingStrategy 
        @Override
        public String tableName(String tableName) 
        //return addUnderscores(columnName); // skip this
        return columnName; // if you want column name variable name same
        //return changeAsYouWant(columnName); // as name sames
       
   

【讨论】:

我建议您在不需要特殊约定的任何表名上也调用“super(tableName)”...也许【参考方案6】:

建议的解决方法是使用 @Column(name="dateofbirth"),这对我的目的有效。

【讨论】:

您是说您所做的唯一更改是大写? 是的。似乎改进命名策略是肇事者,它看到驼峰式列名并转换为小写+下划线。错误或功能,由您决定。【参考方案7】:

您可以注释字段或 getter 方法,这没有什么区别。您可以发布完整的 hibernate.cfg.xml 或 persistence.xml 文件吗?

【讨论】:

【参考方案8】:

将@Column注解放在getter上:

@Column(name="DateOfBirth")
public Date getDateOfBirth() 
...

【讨论】:

【参考方案9】:

我不是 100% 确定,但您不需要注释 get 方法而不是私有变量吗?

【讨论】:

我不这么认为?至少,我可以在实例变量级别指定诸如长度之类的东西,它们会相应地改变列.. 您可以注释任何一个,但您必须一致地注释它们。如果你混合它们并注释一些标题和一些getter,它会找到一个并忽略另一个。

以上是关于休眠列名问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring - 当列名与模型中的名称不同时,本机查询与休眠混合

休眠条件中的子选择

使休眠忽略未映射的类变量[重复]

使用注解或使用休眠配置文件休眠

Hibernate 不会设置 id 列名

惠普电脑休眠怎么唤醒