Si la clave principal compuesto tiene sólo claves suplentes, el uso @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
}
En claseA, tenemos
@Entity
public class ClassA {
private CompoundIdA compoundIdA;
@EmbeddedId
public CompoundIdA getCompoundIdA() {
return this.CompoundIdA;
}
}
Si la clave principal compuesto tiene tanto naturales como claves sustitutas, utilizar nuevamente @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;
}
}
Aviso tiene que configurar insertable = falso y actualizable = falso porque más de una propiedad comparten la misma columna. De lo contrario, Hibernate se quejará de algunos errores.
Si su clave primaria compuesta tiene sólo claves naturales, utilizar @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;
}
}
En ClassB, puede utilizar el mismo enfoque que se muestra arriba, pero si desea definir un @ManyToOne propiedad, usted tiene que configurar insertable = falso y actualizable = false de la siguiente manera
@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;
}
}
respecto,
@Vinodh Ramasubramania Hola, no es una buena idea usar una entidad como clave principal. El equipo de Hibernate lo recomienda. No puede restringir un resultado de consulta en HQL o Criterios en una entidad utilizada como clave principal. Por lo tanto, hay muchas formas en que puede evitar usarlo. –
Pero no estoy usando una entidad como PK. Lo estoy usando (A) para establecer una relación ManyToOne con las condiciones de unión en el PK de B. En su solución, no veo cómo se define el PK compuesto de B (BPK) con el PK compuesto de A (APK) como un subconjunto a esto. –
El OneToMany en su clase BPK me ayuda. No pensé en esa dirección. Seguí pensando cómo hacer referencia a otra clase de APK en BPK. Y no sé cómo configurar la anotación. Para un práctico a.getBset(), modelé otro One2Many con joincolumns en clase A. p.ej. conjunto privado bSet ;. en la clase TypeB, también un manyToOne, que apunta a TypeA. Por supuesto insertable, updatable = false son necesarios. Gracias chicos. –
Kent