代码之家  ›  专栏  ›  技术社区  ›  Kawu

JPA:@JoinColumn和@PrimaryKeyJoinColumn之间的区别?

  •  70
  • Kawu  · 技术社区  · 14 年前

    两者之间的确切区别是什么 @JoinColumn @PrimaryKeyJoinColumn

    你用 @连接柱 对于属于外键的列。典型的列可能如下所示(例如,在具有附加属性的联接表中):

    @ManyToOne
    @JoinColumn(name = "...")
    private OtherClass oc;
    

    如果我把这个列也提升为a/the-PK(即标识关系),会怎么样?因为列现在是PK,所以我必须用 @Id :

    @Id
    @ManyToOne
    @JoinColumn(name = "...")
    private OtherClass oc;
    

    现在的问题是:

    @身份证 @连接柱 和刚才一样 @PrimaryKeyJoin列 ?:

    @ManyToOne
    @PrimaryKeyJoinColumn(name = "...")
    private OtherClass oc;
    

    如果不是,那是什么 有什么事吗?

    2 回复  |  直到 6 年前
        1
  •  56
  •   Community CDub    7 年前

    如果我把这个列也提升为a/the-PK(即标识关系),会怎么样?由于列现在是PK,我必须用@Id(…)标记它。

    这加强了对 派生标识符 实际上是 new stuff in JPA 2.0 2.4.1对应于派生标识的主键 在JPA2.0规范中,JPA1.0不允许 Id OneToOne ManyToOne . 在jpa1.0中,您必须使用 PrimaryKeyJoinColumn Basic

    现在的问题是:@Id+@JoinColumn是否与@PrimaryKeyJoinColumn相同?

    您可以获得类似的结果,但使用 一对一 是用JPA2.0映射派生标识符的首选方法。 PrimaryKeyJoin列 可能仍用于 加入 继承策略。以下是JPA2.0规范的相关章节:

    11.1.40 PrimaryKeyJoinColumn注释

    PrimaryKeyJoin列 指定主键列 另一张桌子。

    这个 注释 用于联接的主表 JOINED 将策略映射到主表 它的超类;它用于 SecondaryTable 从次表到主表; 一对一 引用对象的外键 实体 .

    ...

    PrimaryKeyJoin列 为子类指定注释 在联合映射策略中 外键列假定为 的主表的列 超类。

    ...

    例子:

    @Entity
    @Table(name="CUST")
    @Inheritance(strategy=JOINED)
    @DiscriminatorValue("CUST")
    public class Customer { ... }
    
    @Entity
    @Table(name="VCUST")
    @DiscriminatorValue("VCUST")
    @PrimaryKeyJoinColumn(name="CUST_ID")
    public class ValuedCustomer extends Customer { ... }
    

    [108] 派生id机制 优先于 PrimaryKeyJoin列 一个单子映射的例子。

    另请参见


    http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state 声明使用@manytone和@Id可以与jpa1.x一起工作。现在谁是对的?

    作者使用的是预发行版 EclipseLink的兼容版本(版本 2.0.0-M7 JPA1.0的一部分。

    作为记录,支持 多对一 已添加到EclipseLink 1.1中(请参见 this message James Sutherland Java Persistence 维基书籍)。但让我坚持,这是 不是

        2
  •  40
  •   Sam YC    7 年前

    我通常通过这个图表来区分这两种情况:

    使用 PrimaryKeyJoinColumn

    enter image description here

    使用 JoinColumn

    enter image description here

        3
  •  2
  •   Philip Read    5 年前

    我知道这是一个旧的职位,但一个很好的时间使用 PrimaryKeyColumn

    一般来说,这是一个坏主意,最好使用外键关系 JoinColumn .