3

次の状況を解決する必要がありますが、機能しませんでした (Hibernate と EclipseLink を試しました)。

Table_1:
    Column_A is Primary Key
    ... some other columns do follow

.

Table_2:
Column_x is Primary Key and is Foreign Key to Table_1.Column_A
Column_y is Primary Key and is Foreign Key to Table_1.Column_A
Column_z is Primary Key

したがって、表 2 には複合主キーがあります。

私は次の方法でそれを実現しようとしました:

class Table_1 {
  @Id int Column_A;
}

.

class Table_2 {
  @EmbeddedId PK key;

  @Embeddable class PK {
    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_x",referencedColumnName="Column_A")
    int Column_x;

    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_y",referencedColumnName="Column_A")
    int Column_y;

    int Column_z;

    public boolean equals(Object O) { ... }
    public int hashCode() { ... } 
  }
}

ただし、実行すると、EclipseLink から @Embeddable で「基本的な」注釈のみを使用できるというヒントが得られます。したがって、私の質問は、上記のシナリオをどのように解決するかです。

クラス Table_1 のソース コードにはアクセスできませんが、そのまま使用する必要があります。また、Table_1 への外部キーを確立するクラス/テーブルがさらに存在する可能性が非常に高くなります。

4

2 に答える 2

1

@IdClass を使用します。

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

@IdClass(PK.class)
class Table_2 {
    @Id
    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_x",referencedColumnName="Column_A")
    Table_1 Column_x;

    @Id
    @OneToOne(targetEntity=Table_1.class)
    @JoinColumn(name="Column_y",referencedColumnName="Column_A")
    Table_1 Column_y;

    @Id
    int Column_z;

    public boolean equals(Object O) { ... }
    public int hashCode() { ... } 
  }
}

class PK {
    int Column_x;
    int Column_y;
    int Column_z;
}
于 2012-04-23T15:05:20.317 に答える
0

@EmbeddedId を使用するのは正しいことです (@IdClass ではなく、外部キーよりも生成された ID に適しています)。あなたの問題は、実際に Table_1 または Table_2 クラスに入力する必要があるときに、これらの FK を整数として宣言していることだと思います。

于 2015-12-30T19:23:01.133 に答える