Aquí hay una clave primaria compuesta para una de mis entidades.@IdClass Anotación JPA
public class GroupMembershipPK implements Serializable{
private static final long serialVersionUID = 7816433876820743311L;
private User user;
private Group group;
public GroupMembershipPK(){
}
public boolean equals(Object o){
if(o==null){
return false;
}
if(o instanceof GroupMembershipPK){
final GroupMembershipPK groupMembershipPK=(GroupMembershipPK)o;
return groupMembershipPK.group.getGroupName().equals(this.group.getGroupName()) &&
groupMembershipPK.user.getName().equals(this.user.getName());
}
return false;
}
public int hashCode(){
return super.hashCode();
}
}
Heres my entity (part of) utilizando lo anterior como clave primaria compuesta.
@Entity
@IdClass(GroupMembershipPK.class)
public class GroupMembership extends AbstractModelElementVersionOther{
private static final long serialVersionUID = 9188465566607060376L;
private String memType;
private Group group;
private User user;
public GroupMembership(){
super();
}
@Column(nullable=false)
public String getMemType(){
return this.memType;
}
public void setMemType(String memType){
this.memType=memType;
}
@Id
@ManyToOne
@JoinColumn(name="groupId")
public Group getGroup(){
return this.group;
}
public void setGroup(Group group){
this.group=group;
}
@Id
@ManyToOne
@JoinColumn(name="userId")
public User getUser(){
return this.user;
}
public void setUser(User user){
this.user=user;
}
@Override
public boolean equals(Object o) {
//
Estoy un poco confundido sobre lo que debería ser la implementación del método igual para la entidad anterior. ¿Cómo puedo comparar dos claves primarias compuestas?
También son bienvenidos los comentarios sobre otras partes de mi código.
También debe implementar un método hashCode que utiliza el ID de usuario y las propiedades GROUPID, ya que los objetos iguales también deben tener el mismo hash. Por ejemplo: (getUserId() == null? 0: getUserId(). HashCode())^(getGroupId() == null? 0: getGroupId(). HashCode()) –
@ Jörn Horstmann Hola, eres derecho. Pero se ha implementado solo equivale a la implementación debido a la respuesta. Gracias de todos modos –
@Arthur Ronald. Gracias, funciona a la perfección. Sin embargo, ¿puede decirme cómo persistir la entidad utilizando una clave primaria compuesta como se describe arriba? Obtengo el siguiente error en JBoss cuando intento hacer eso .------- "Excepción en el hilo" main "javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for esta clase debe asignarse manualmente antes de llamar a save() " – soontobeared