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

时间:2010-11-12 20:47:18

标签: inheritance jpa join multiple-columns joined-subclass

我有两个类FooBar映射到两个不同的表,我希望它们使用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如何决定使用哪个列来加入,但我默认它会使用主键。我想加入他们不仅仅是主键而是两个列,而不是两个,在这种情况下是column1column2

我甚至可能以错误的方式解决这个问题。我很感激任何帮助或建议。谢谢!

2 个答案:

答案 0 :(得分:2)

  

我不确定@Inheritance如何决定使用哪个列来加入,但我默认它会使用主键。

这是正确的,这在JPA 1.0规范的以下部分中进行了解释

  

9.1.32 PrimaryKeyJoinColumn Annotation

     

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

     

PrimaryKeyJoinColumn注释是   用于加入主表   JOINED映射中的实体子类   战略到它的主要表   超;它用在一个   要加入的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注释”

答案 1 :(得分:2)

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

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys

如果使用EclipseLink,您可以使用DescriptorCustomizer和addForeignKeyFieldNameForMultipleTable()定义所需的任何类型的连接。

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