1

2つのクラスがFooありBar、2つの異なるテーブルにマップされており、継承戦略を使用したいのですJOINEDが、2つの非キー列を使用して結合されています。スキーマはかなり奇妙ですが、私はそれに固執しています。これが私の設定です:

@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が結合に使用する列をどのように決定するかはわかりませんが、デフォルトでは主キーを使用すると想定しています。主キー以外の1つの列だけでなく、この場合は2つの列に対してそれらを結合したいと思いcolumn1ますcolumn2

私はこれについて間違った方法で行っているかもしれません。ヘルプや提案をいただければ幸いです。ありがとう!

4

2 に答える 2

2

JPA では、複数のテーブルまたは継承されたテーブルを Id 列で結合することのみが許可されます。どの JPA プロバイダーを使用していますか? 他のオプションを提供するものもあります。

http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keysを参照してください 。

EclipseLink を使用している場合は、DescriptorCustomizer と addForeignKeyFieldNameForMultipleTable() を使用して、任意のタイプの結合を定義できます。

それ以外の場合、スキーマを変更できない場合は、結合を行うビューを作成し、TABLE_PER_CLASS 継承を使用してサブクラスをビューにマップすることができます。

于 2010-11-15T14:21:43.197 に答える
2

I'm not sure how @Inheritance decides what column to use to join against, but I'm assuming by default it uses the primary key(s).

This is correct and this is explained in the following section of the JPA 1.0 specification

9.1.32 PrimaryKeyJoinColumn Annotation

注釈はPrimaryKeyJoinColumn、別のテーブルに結合するための外部キーとして使用される主キー列を指定します。

PrimaryKeyJoinColumn アノテーションは、JOINED マッピング戦略でエンティティ サブクラスのプライマリ テーブルをそのスーパークラスのプライマリ テーブルに結合するために使用されます。SecondaryTable2 次テーブルを 1 次テーブルに結合するために注釈内で使用され ます。OneToOne また、参照元エンティティの主キーが参照先エンティティへの外部キーとして使用されるマッピングで使用できます。

...

PrimaryKeyJoinColumn マッピング戦略でサブクラスに注釈が指定されていない場合JOINED、外部キー列はスーパークラスの主テーブルの主キー列と同じ名前を持つと見なされます。

...

また、上記の注釈 (またはPrimaryKeyJoinColumns複合キーを使用する場合) により、現在のテーブルの主キー列の名前と、結合されるテーブルの主キー列の名前を制御できます。

主キー以外の 1 つの列だけでなく、この場合は column1 と column2 の 2 つの列に対してそれらを結合したいと思います。

これが機能するかどうかはわかりませんが、(サブクラスで)次のことを試してみます。

@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注釈」
于 2010-11-13T07:21:33.610 に答える