2012-04-23 11 views
3

私は解決するために、以下のような状況を持っているが、それは(HibernateとEclipseLinkはを試してみました)仕事を得ることができませんでした:JPA:組み込み可能なクラスで外部キー

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() { ... } 
    } 
} 

はしかし、私は@Embeddableに、私は唯一の「基本」のアノテーションを使用することでEclipseLinkからヒントを得ます。したがって、私の質問は、上記の描かれたシナリオを解決する方法ですか?

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

答えて

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; 
} 
0

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

関連する問題