【问题标题】:JPA: default column name mapping for @ManyToOne relationsJPA:@ManyToOne 关系的默认列名映射
【发布时间】: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') 是故意的)

【问题讨论】:

    标签: java hibernate jpa openjpa


    【解决方案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 将如何映射没有“名称”属性的属性。
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多