休眠列名问题
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,它会找到一个并忽略另一个。以上是关于休眠列名问题的主要内容,如果未能解决你的问题,请参考以下文章