2011-12-07 10 views
2

"A"、 "B"、 "C"の3つの列を持つ表があります。これらの列の2つ(AとB)は、表の複合主キーです。私はこのテーブル用のJavaクラスを作成しました。クラス内のデータをテーブル内のデータにマップするためにHibernateを使用しています。私は、埋め込み(つまりコンポジット)キー用に別のクラスを作成しました。Hibernate:EmbeddedIdsで複製されたゲッター/セッター?

2つのクラスは次のようになります。

@Entity 
@Table(name="SOME_TABLE", schema="SOME_SCHEMA") 
public class Outer { 
    private Key key; 
    private String a; 
    private String b; 
    private String c; 

    @EmbeddedId 
    public Key getId() { 
     return this.key; 
    } 

    // Also a setter for Key... 

    @Column(name="A") 
    public String getA() { 
     return this.a; 
    } 

    public void setA(final String a) { 
     this.a = a; 
    } 

    // Also setters and getters for B and C. 
} 

​​

すべてのHibernateのドキュメントは、getterとsetterがどこに行かなければならないのかを詳しく説明しているようです。 OuterとKeyの両方にコンポジットキーを構成する値のセッターが必要ですか?私が両方の場所にセッターを持っている場合、Aの値をアウターに設定すると、Hibernateは正しいことを行います(つまり、Keyの値を設定します)? Outer.getA/B()とOuter.setA/B()はKeyクラスに従うべきですか?

同じデータに対して2つの場所にセッターを置くことは、コーディングが悪いと思います。少なくともあいまいです。私は、Hibernateが私のためにKeyクラスの値を設定することを望んでいますが、確かに知りたいです。ありがとう!

-joe

答えて

1

私は@EmbeddedIdと100%確実ではないが、私はそれが通常の@Embeddedプロパティと同じように扱われなければならないと思いますので、私は、マッピングは、次のようにすべきだと思います。

@Entity 
@Table(name="SOME_TABLE", schema="SOME_SCHEMA") 
public class Outer { 
    private Key key; 
    // no fields a and b here 
    private String c; 

    @EmbeddedId 
    public Key getId() { 
     return this.key; 
    } 

    // Also a setter for Key... 

    @Transient 
    public String getA() { 
     return this.key.getA(); 
    } 

    public void setA(final String a) { 
     this.key.setA(a); 
    } 

    @Transient 
    public String getB() { 
     return this.key.getB(); 
    } 

    public void setB(final String b) { 
     this.key.setB(b); 
    } 

    // Also setters and getters for C. 
} 
+0

感謝、tscho。私はめったに@Embeddedを使用しないので、そこへの接続にはジャンプしませんでした。私は、私の元の質問に答えるために、 "キーへの委任"がアプローチだと思います。 – joemadeus

関連する問題