2

「A」、「B」、「C」の3つの列を持つテーブルがあります。これらの列のうちの 2 つ (A と B) は、テーブルの複合主キーです。このテーブルの Java クラスを作成し、Hibernate を使用してクラス内のデータをテーブル内のデータにマップしています。Embedded (つまり、複合) キー用に別のクラスを作成しました。

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.
}

.

@Embeddable
public class Key {
    private String a;
    private String b;

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

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

    // Also a getter & setter for B.
}

Hibernate のすべてのドキュメントは、ゲッターとセッターがどこに行くべきかを正確に説明しているようです。Outer と Key の両方に、複合キーを構成する値のセッターが必要ですか? 両方の場所にセッターがある場合、Outer に A の値を設定すると、Hibernate は正しいこと (つまり、Key に値を設定する) を行いますか? Outer.getA/B() と Outer.setA/B() は Key クラスに従うべきですか?

同じデータに対して 2 つの場所にセッターを配置するのは、コーディングの習慣としては不適切だと思います。少なくともあいまいです。Hibernate が Key クラスの値を設定してくれることを期待していますが、確実に知りたいです。ありがとう!

-ジョー

4

1 に答える 1

1

100%確信は@EmbeddedIdありませんが、通常のプロパティと同じように処理する必要があると@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.
}
于 2011-12-07T23:37:52.187 に答える