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

36

当我们有一个类:

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

并且:

@Entity
OrderLine implements Serializable {
    @Id
    private Integer id;

    @ManyToOne
    Order order;
    ...
}

在属性order中,行名称将映射到哪里?

order_id、ORDER_ID或Order_id?

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

2个回答

48

我可能没有理解你的问题。不过,你是否需要类似以下的内容?

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

这里有一些示例


2
我需要知道默认映射,也就是没有“name”属性时JPA如何映射属性。 - Kdeveloper

39
这是JPA 1.0规范关于JoinColumn注释的内容:

9.1.6 JoinColumn Annotation

...

name注释元素定义了外键列的名称。除了referencedColumnName之外,其余注释元素(与Column注释的语义相同)都引用该列。

如果只有一个联接列,并且name注释成员不存在,则连接列名称将形成如下:引用实体的引用关系属性或字段的名称;"_";所引用的主键列的名称。如果在实体中没有这样的引用关系属性或字段(即使用联接表),则连接列名称将形成如下:实体的名称;"_";所引用的主键列的名称。

...

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

参考文献

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

你确定JPA总是映射到小写吗?在谷歌搜索中,我发现有些人说JPA有时会映射到大写的表名和字段名。 - Kdeveloper
@Kdeveloper JPA 1.0的文档链接为:http://jcp.org/en/jsr/detail?id=220,而JPA 2.0的文档链接为:http://jcp.org/en/jsr/detail?id=317。 - Pascal Thivent
1
@Kdeveloper 规范中说:“引用实体的引用关系属性或字段的名称(...)”在你的情况下,它是 order;然后是“_”;最后是 id,这是被引用的主键列的名称。 - Pascal Thivent

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