Hibernate:与EmbeddedIds重复的getter / setter?

时间:2011-12-07 23:02:12

标签: java hibernate orm composite-key embeddable

我有一个包含三列的表,“A”,“B”和“C”。其中两列(A和B)是表的复合主键。我为这个表编写了一个Java类,我正在使用Hibernate将类中的数据映射到表中的数据。我为Embedded(即复合)键创建了另一个类。

这两个类看起来像这样:

@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文档都掩盖了getter和setter应该去的地方。外部和密钥是否都应该为构成复合密钥的值设置?如果我在这两个地方都有一个setter,那么如果我在外面设置A的值,Hibernate会做正确的事情(即设置Key的值)吗? Outer.getA / B()和Outer.setA / B()是否应该遵守Key类?

我认为在同一数据的两个位置设置setter是不好的编码实践。至少它是模棱两可的。我希望Hibernate会为我设置Key类的值,但我想知道肯定。谢谢!

-Joe

1 个答案:

答案 0 :(得分: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.
}