代码之家  ›  专栏  ›  技术社区  ›  Alex Beardsley

具有多个非键列的继承联接策略

  •  1
  • Alex Beardsley  · 技术社区  · 15 年前

    我有两节课 Foo 和 Bar 映射到两个不同的表,我希望它们使用 JOINED 继承策略,但使用两个非键列联接。这个模式很奇怪,但我坚持了下来。这是我的设置:

    @Entity
    @Table(name="foo")
    @Inheritance(strategy=InheritanceType.JOINED)
    public class Foo {
        @Id
        private Integer uniqueFooId;
    
        @Column(name="column1")
        private String column1;
    
        @Column(name="column2")
        private String column2;
    
        @Column(name="someValue")
        private String someValue;
    }
    
    @Entity
    @Table(name="bar")
    public class Bar extends Foo {
        @Id
        private Integer uniqueBarId;
    
        @Column(name="column1")
        private String column1;
    
        @Column(name="column2")
        private String column2;
    
        @Column(name="someOtherValue")
        private String someOtherValue;
    }
    

    我不确定@Inheritance如何决定要对哪个列进行联接,但我假设默认情况下它使用主键。在这种情况下,我不想只针对主键以外的一列,而是针对两列加入它们 column1 和 column2 .

    我甚至可能走错了路。如果有任何帮助或建议,我将不胜感激。谢谢!

    2 回复  |  直到 15 年前
        1
  •  2
  •   James    15 年前

    JPA只允许Id列连接多个表或继承的表。你在使用什么JPA提供者?有些提供了其他选择。

    看, http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys

    如果使用EclipseLink,则可以使用描述符rcustomizer和addForeignKeyFieldNameForMultipleTable()定义所需的任何类型的连接。

    否则,如果无法更改架构,可以尝试创建一个执行联接的视图,并使用TABLE_PER_类继承并将子类映射到该视图。

        2
  •  2
  •   Pascal Thivent    15 年前

    我不确定@Inheritance如何决定要对哪个列进行联接,但我假设默认情况下它使用主键。

    这是正确的,JPA 1.0规范的下一节对此进行了解释

    9.1.32 PrimaryKeyJoinColumn注释

    这个 PrimaryKeyJoinColumn 注释 指定主键列 用作加入的外键 另一张桌子。

    PrimaryKeyJoinColumn注释是 用于联接 连接映射中的实体子类 its主表的策略 超类;它用于 SecondaryTable 要加入的批注 从次表到主表; 它可以用在 OneToOne 其中的主键 引用实体用作 引用实体的外键。

    ...

    如果没有 PrimaryKeyJoinColumn 为子类指定了批注 在 JOINED 地图策略 外键列假定为 与主键同名 的主表的列 超类。

    ...

    以及上述注释(或 PrimaryKeyJoinColumns 当使用组合键时)可以在 当前表的主键列的名称 以及 要联接到的表的主键列的名称 .

    我想加入它们,不仅针对主键以外的一列,而且针对两列,在本例中是column1和column2。

    我不确定这是否有效,但我会尝试以下操作(在子类中):

    @Entity
    @Table(name="bar")
    @PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="column1",
            referencedColumnName="column1"),
        @PrimaryKeyJoinColumn(name="column2",
            referencedColumnName="column2")
    })
    public class Bar extends Foo {
        @Id
        private Integer uniqueBarId;
    
        @Column(name="column1")
        private String column1;
    
        @Column(name="column2")
        private String column2;
    
        @Column(name="someOtherValue")
        private String someOtherValue;
    }
    

    我想知道JPA提供商是否会投诉。

    工具书类

    • JPA 1.0规范
      • 第9.1.32节“PrimaryKeyJoinColumn注释”
      • 第9.1.33节“PrimaryKeyJoinColumns注释”