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 选择查询以返回带有 @ManyToOne 映射的实体
Embeddable 和 EmbeddedId 之间的 JPA 映射 @ManyToOne