JPA:@ManyToOne 关系的默认列名映射

Posted

技术标签:

【中文标题】JPA:@ManyToOne 关系的默认列名映射【英文标题】:JPA: default column name mapping for @ManyToOne relations 【发布时间】:2011-04-27 05:11:49 【问题描述】:

当我们有课时:

@Entity
Order implements Serializable 
    @Id
    private Integer id;
    ...

和:

@Entity
OrderLine implements Serializable 
    @Id
    private Integer id;

    @ManyToOne
    Order order;
    ...

属性order将映射到什么行名

order_id, ORDER_ID or Order_id?

(省略 @JoinColumn(name='order_id') 是故意的)

【问题讨论】:

【参考方案1】:

以下是 JPA 1.0 规范中关于 JoinColumn 注释的内容:

9.1.6 JoinColumn注解

...

name 注释元素定义 外键列的名称。 剩余的注释元素 (referencedColumnName除外) 参考这个专栏和有相同的 Column 的语义 注释。

如果只有一个连接列,并且 如果 name 注释成员是 缺少,连接列名称是 形成为的串联 以下:引用的名称 的关系属性或领域 参考实体; "_";的名字 引用的主键列。如果 没有这样的参考 关系属性或字段 实体(即使用连接表), 连接列名称形成为 以下内容的串联: 实体名称; "_";的名字 引用的主键列。

...

因此,在您的示例中,外键列的默认名称为 order_id

参考文献

JPA 1.0 规范 第 9.1.6 节“JoinColumn 注释”

【讨论】:

你确定 JPA 总是映射到小写吗?在 Google 搜索期间,我发现有人说 JPA 有时会映射到大写的表和字段名称。 @Kdeveloper 对于 JPA 1.0:jcp.org/en/jsr/detail?id=220 和对于 JPA 2.0:jcp.org/en/jsr/detail?id=317 @Kdeveloper 规范说 “引用实体的引用关系属性或字段的名称 (...)” 在您的情况下,它是 order;然后 ”_”;然后id 是引用的主键列的名称。【参考方案2】:

我可能不明白你的问题。但是,您不需要像下面这样的东西吗?

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="order_id", nullable=false)
Order order;

here are some examples

【讨论】:

我需要知道默认映射,因此 JPA 将如何映射没有“名称”属性的属性。

以上是关于JPA:@ManyToOne 关系的默认列名映射的主要内容,如果未能解决你的问题,请参考以下文章

使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表

JPA 表映射的自动列名生成

JPA 选择查询以返回带有 @ManyToOne 映射的实体

Embeddable 和 EmbeddedId 之间的 JPA 映射 @ManyToOne

如何使用 Spring Data JPA(Hibernate) 跨映射表过滤关联实体?

Java JPA双向ManyToOne映射不起作用