Ecco una chiave primaria composta per una delle mie entità.@IdClass JPA Annotation
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();
}
}
Ecco la mia entità (parte di) utilizzando il precedente come chiave primaria composta.
@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) {
//
Sono un po 'confuso su quale dovrebbe essere l'implementazione del metodo di uguale per l'entità di cui sopra. Come posso confrontare due chiavi primarie composite?
Anche i commenti su altre parti del mio codice sono ben accetti.
si dovrebbe anche implementare un metodo hashCode che utilizza le proprietà GroupID UserID e, in quanto oggetti uguali devono anche avere lo stesso hash. Per esempio: (getUserId() == null? 0: getUserId(). HashCode())^(getGroupId() == null? 0: getGroupId(). HashCode()) –
@ Jörn Horstmann Ciao, sei destra. Ma è stato implementato solo uguale implementazione a causa della risposta. Grazie comunque –
@Arthur Ronald. Grazie, funziona perfettamente. Tuttavia, puoi dirmi come mantenere l'entità utilizzando una chiave primaria composita come descritto sopra? Ottengo il seguente errore in JBoss quando provo a farlo .------- "Eccezione nel thread" main "javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for questa classe deve essere assegnata manualmente prima di chiamare save() " – soontobeared