Hibernate 列名问题

hibernate column name issues

提问人:lucas 提问时间:12/18/2008 更新时间:10/3/2023 访问量:62011

问:

@Column(name="DateOfBirth")
private Date dateOfBirth;

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

Java Hibernate 注解

评论

1赞 OscarRyz 12/18/2008
可能的工作。如果将其命名为 dateofbirth,则数据库中的列将按此命名,但属性名称应相同。
0赞 OscarRyz 12/18/2008
让我把它作为一个答案,然后:)

答:

0赞 davetron5000 12/18/2008 #1

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

评论

0赞 lucas 12/18/2008
我不这么认为?至少,我可以在实例变量级别指定长度之类的内容,它们将相应地更改列。
0赞 Nathan 12/5/2015
您可以对其中任何一个进行注释,但必须一致地对它们进行注释。如果你混合它们并注释一些标头和一些 getter,它会找到一个并忽略另一个。
7赞 Ryan Anderson 12/18/2008 #2

将 @Column 注解放在 getter 上:

@Column(name="DateOfBirth")
public Date getDateOfBirth() {
...
}
1赞 cliff.meyers 12/18/2008 #3

您可以注释字段或 getter 方法,这没有区别。你能发布你的完整休眠.cfg.xml或持久性.xml文件吗?

6赞 lucas 12/18/2008 #4

建议的解决方法是使用 @Column(name=“dateofbirth”),这适用于我的目的。

评论

0赞 Matt Solnit 12/18/2008
你是说你所做的唯一改变是大写?
0赞 lucas 12/19/2008
是的。似乎 ImprovedNamingStrategy 是肇事者,它看到驼峰列名称并转换为小写+下划线。错误或功能,由您决定。
12赞 OscarRyz 12/18/2008 #5

这里有一个可能的解决方法:如果你命名它,数据库中的列将像这样命名,但属性名称应该相同。dateofbirth

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

我以前遇到过这个问题。我使用的旧列名称“employeename”、“employeerole”、“departmentlocation”中没有空格。我讨厌它,因为我所有的豆子属性都必须没有骆驼壳。

如您刚才所看到的,以“_”分隔的数据库列将用于正确 camelCase。

34赞 Dan Vinton 12/18/2008 #6

仅供参考:插入下划线的原因可能是因为您使用的是 ImprovedNamingStrategy。它是在 Configuration 对象上设置的。有关示例,请参阅此处...

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

评论

0赞 Charles Morin 9/26/2014
这正是导致这个问题的原因。对我来说就像一个魅力。
0赞 sajal rajabhoj 9/14/2018
谢谢,它真的帮助了我。您能否建议任何链接来查看我在使用 DefaultNamingStrategy 而不是改进的策略时会缺少什么?
5赞 syedmuneer 10/16/2012 #7

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

    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
       }
   }

评论

0赞 mschmoock 10/16/2012
我建议在你不需要特殊约定的任何表名上调用“super(tableName)”......或
42赞 Rahul Singh 6/14/2017 #8

试着把这个放进去

application.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
10赞 ErSyyedS 7/31/2017 #9

在 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

评论

1赞 Jörg 10/30/2018
这曾经有效,但自从 spring-boot 2 (2.0.4) 和 hibernate 5.2 (5.2.17) 以来,它不再起作用了。我调试了整个休眠状态,命名策略实际上不会干扰,但之后其他一些休眠魔法会进行转换,为 camlCase 属性添加下划线。这真的很糟糕,尤其是显式@Column(name=“nameWithCamlCase”)无济于事,休眠仍然认为比开发人员想要的更聪明。我认为一些最新的 JPA 合规性问题导致了这种疯狂。
0赞 Mateusz K. 5/23/2022 #10

我遇到了类似的问题,将以下两个属性添加到我的application.properties解决了我的问题:。spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImplspring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl