如果複合主鍵有只有代理鍵,使用@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