如果复合主键有只有代理键,使用@EmbeddableId
@Embeddable
public class CompoundIdA implements Serializable {
private Integer field0;
private Integer field1;
private Integer field2;
private Integer field3;
@Column(name="FIELD_0")
public Integer getField0() {
return this.field0;
}
@Column(name="FIELD_1")
public Integer getField1() {
return this.field1;
}
@Column(name="FIELD_2")
public Integer getField2() {
return this.field2;
}
@Column(name="FIELD_3")
public Integer getField3() {
return this.field3;
}
public boolean equals(Object o) {
if(o == null)
return false;
if(!(o instanceof CompoundIdA))
return false;
final CompoundIdA other = (CompoundIdA) o;
if(!(getField0().equals(other.getField0()))
return false;
if(!(getField1().equals(other.getField1()))
return false;
if(!(getField2().equals(other.getField2()))
return false;
if(!(getField2().equals(other.getField2()))
return false;
return true;
}
// hashcode impl
}
在ClassA的,我们有
@Entity
public class ClassA {
private CompoundIdA compoundIdA;
@EmbeddedId
public CompoundIdA getCompoundIdA() {
return this.CompoundIdA;
}
}
如果复合主键有自然和代理键,再次使用@EmbeddableId
// Let's suppose field0 and field1 are both natural keys
@Entity
public class ClassA {
private CompoundIdA compoundIdA;
private Integer field0;
private Integer field1;
@EmbeddedId
public CompoundIdA getCompoundIdA() {
return this.CompoundIdA;
}
@Column(name="FIELD_0", insertable=false, updateable=false)
public Integer getField0() {
return this.field0;
}
@Column(name="FIELD_1", insertable=false, updateable=false)
public Integer getField1() {
return this.field1;
}
}
注意您必须设置insertable = false和updateable = false,因为多个属性共享同一列。否则,Hibernate会抱怨一些错误。
如果复合主键有只有自然键,如果你要定义一个@ManyToOne使用@IdClass
@Entity
@IdClass(CompoundIdA.class)
public class ClassA {
private Integer field0;
private Integer field1;
private Integer field2;
private Integer field3;
@Id
@Column(name="FIELD_0")
public Integer getField0() {
return this.field0;
}
@Id
@Column(name="FIELD_1")
public Integer getField1() {
return this.field1;
}
@Id
@Column(name="FIELD_2")
public Integer getField2() {
return this.field2;
}
@Id
@Column(name="FIELD_3")
public Integer getField3() {
return this.field3;
}
}
在ClassB的,你可以使用相同的方法如上图所示,但财产,你必须设置插入=虚假和更新=假如下
@Entity
public class ClassB {
private ClassA classA;
@ManyToOne
@JoinColumns ({
@JoinColumn(name="FIELD_0", referencedColumnName="FIELD_0", insertable=false, updateable=false),
@JoinColumn(name="FIELD_1", referencedColumnName="FIELD_1", insertable=false, updateable=false),
@JoinColumn(name="FIELD_2", referencedColumnName="FIELD_2", insertable=false, updateable=false),
@JoinColumn(name="FIELD_3", referencedColumnName="FIELD_3", insertable=false, updateable=false)
})
public ClassA getClassA() {
return this.classA;
}
}
问候,
@Vinodh Ramasubramania嗨,使用实体作为主键不是一个好主意。 Hibernate Team推荐。您不能在用作主键的实体中限制HQL或条件中的查询结果。因此,有很多方法可以避免使用它。 – 2010-02-03 19:57:55
但我没有使用实体作为PK。我使用它(A)与B的PK中的连接条件建立ManyToOne关系。在您的解决方案中,我没有看到B(BPK)的复合PK是如何用A(APK)的复合PK定义为它的一个子集。 – 2010-02-03 20:29:37
您的BPK课程中的oneToMany可以帮助我。我没有想到这个方向。我一直在想如何引用BPK中的另一个APK类。而且不知道如何设置注释。 为了方便使用a.getBset(),我使用A类中的joincolumns建模了另一个One2Many。例如私人套装 bSet ;.在TypeB类中,也是manyToOne,指向TypeA。当然可以插入,updatable = false是需要的。 谢谢你们。 –
Kent
2010-02-04 12:44:17