2

我有一个三列的表,“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 应该去哪里。Outer 和 Key 是否都应该具有组成复合键的值的设置器?如果我在两个地方都有一个设置器,那么如果我在 Outer 上设置 A 的值,Hibernate 是否会做正确的事情(即在 Key 上设置值)?Outer.getA/B() 和 Outer.setA/B() 应该遵循 Key 类吗?

我认为在两个地方为相同的数据设置 setter 是不好的编码习惯。至少是模棱两可的。我希望 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 回答