我有一个包含三列的表,“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
答案 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.
}