Wenn Ihre Verbindung Primärschlüssel nur Ersatzschlüssel haben, verwenden @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
}
In KlasseA wir
@Entity
public class ClassA {
private CompoundIdA compoundIdA;
@EmbeddedId
public CompoundIdA getCompoundIdA() {
return this.CompoundIdA;
}
}
haben Wenn Ihre Verbindung Primärschlüssel sowohl natürliche haben und Ersatzschlüssel, erneut verwenden @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;
}
}
Hinweis Sie müssen einführbare = false und updateable = false einrichten, weil mehr als eine Eigenschaft die gleiche Spalte teilen. Andernfalls wird Hibernate einige Fehler melden.
Wenn Ihre Verbindung Primärschlüssel nur natürliche Schlüssel haben, verwenden @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;
}
}
In ClassB, können Sie die gleiche Methode verwenden, wie oben gezeigt, aber, wenn Sie einen @ManyToOne definieren möchten Eigenschaft, müssen Sie einführbar = false und aktualisierbar = false wie folgt
@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;
}
}
Grüße eingerichtet,
@Vinodh Ramasubramania Hallo, es ist keine gute Idee, eine Entität als Primärschlüssel zu verwenden. Hibernate Team empfiehlt. Sie können ein Abfrageergebnis in HQL oder Kriterien nicht auf eine Entität beschränken, die als Primärschlüssel verwendet wird. Daher gibt es viele Möglichkeiten, wie Sie vermeiden können, es zu verwenden. –
Aber ich verwende keine Entität als PK. Ich verwende es (A), um eine ManyToOne-Beziehung mit den Join-Bedingungen in der PK von B herzustellen. In Ihrer Lösung sehe ich nicht, wie die zusammengesetzte PK von B (BPK) mit der zusammengesetzten PK von A (APK) definiert ist eine Teilmenge dazu. –
Die OneToMany in Ihrer BPK-Klasse hilft mir. Ich habe nicht in diese Richtung gedacht. Ich habe gerade darüber nachgedacht, wie ich eine andere APK-Klasse in BPK referenzieren soll. Und ich weiß nicht, wie ich die Annotation einstellen soll. Für eine bequeme a.getBset() modellierte ich eine andere One2Many mit Joincolumns in A-Klasse. z.B. privat Set bSet ;. in der TypeB-Klasse auch ein manyToOne, das auf TypeA verweist. natürlich einfügbar, update = false wird benötigt. Danke Jungs. –
Kent