在Hibernate中,@JoinColumn注释是否是必需的?

6
在Hibernate中,为了指定一个用于关联连接的列,需要使用@JoinColumn注解,例如像这样:
@ManyToOne
@JoinColumn(name="address_id")
public Address getAddress() { 
    return address; 
}

在大多数情况下,列的名称是蛇形命名法类名加上_id。因此,合理地期望Hibernate可以自动推导出它(例如,在Django的ORM中已经实现了这样的功能)。但是,这种行为是否已经被实现了呢?


JPA有一个默认的命名约定,在JPA规范中可见。如此链接所示:http://www.datanucleus.org/products/accessplatform_4_2/jpa/orm/datastore_identifiers.html#rdbms_jpa - Neil Stockton
如果您不使用它,可能会最终得到一个不必要的连接表。 - Tobb
2个回答

16

没必要,JPA 遵循约定优于配置的原则,这意味着总是有一些默认值,您可以用注释来覆盖。

@JoinColumn的情况下,默认列名生成方式如下:<field_name>_<id_column_name>

field_name 在您的情况下是 address,而 id_column_name 是指相关实体的 id,即 id。因此,您默认会得到 address_id


如果我需要使用蛇形命名法(例如 postal_code)的列名,而字段名是小驼峰式命名法(postalCode),该怎么办? - Mikhail Batcer
1
如果您需要覆盖默认命名约定,那么@JoinColumn正是为此而设计的。 - Tobb
@Tobb 这是一个本地覆盖,必须在每个地方都重复。它只覆盖一个列名。是否可能在一个地方(例如配置文件)覆盖命名约定本身,适用于整个项目? - Mikhail Batcer
据我所知,JPA规范中没有这个功能。也许有些提供商可以实现这个功能。 - Tobb
2
@MikhailBatcer,由于您似乎正在使用Hibernate,因此您可以实现自己的org.hibernate.cfg.NamingStrategy并通过使用参数hibernate.ejb.naming_strategy进行注册。请查看此链接获取更多信息。 - Predrag Maric

3

不一定需要使用@JoinColumn注解。您可以随时覆盖它。如果您在代码中没有提供它,Hibernate会自动生成一个列名的默认值。


1
请问您能否更具体一些?默认生成的名称是什么,我该如何覆盖这个注释? - Mikhail Batcer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接