Tengo una relación de muchos a mayo CohortGroup y Employee. Cada vez que inserto un empleado en CohortGroup, hibernate elimina el grupo de la tabla de resolución y vuelve a insertar todos los miembros, más el nuevo. ¿Por qué no solo agregas el nuevo?hibernar insertar en una colección provoca una eliminación luego todos los elementos en la colección que se insertará de nuevo
La anotación en el Grupo:
@ManyToMany(cascade = { PERSIST, MERGE, REFRESH })
@JoinTable(name="MYSITE_RES_COHORT_GROUP_STAFF",
joinColumns={@JoinColumn(name="COHORT_GROUPID")},
inverseJoinColumns={@JoinColumn(name="USERID")})
public List<Employee> getMembers(){
return members;
}
El otro lado en el Empleado
@ManyToMany(mappedBy="members",cascade = { PERSIST, MERGE, REFRESH })
public List<CohortGroup> getMemberGroups(){
return memberGroups;
}
Código snipit
Employee emp = edao.findByID(cohortId);
CohortGroup group = cgdao.findByID(Long.decode(groupId));
group.getMembers().add(emp);
cgdao.persist(group);
a continuación es el sql reportado en el registro de
delete from swas.MYSITE_RES_COHORT_GROUP_STAFF where COHORT_GROUPID=?
insert into swas.MYSITE_RES_COHORT_GROUP_STAFF (COHORT_GROUPID, USERID) values (?, ?)
insert into swas.MYSITE_RES_COHORT_GROUP_STAFF (COHORT_GROUPID, USERID) values (?, ?)
insert into swas.MYSITE_RES_COHORT_GROUP_STAFF (COHORT_GROUPID, USERID) values (?, ?)
insert into swas.MYSITE_RES_COHORT_GROUP_STAFF (COHORT_GROUPID, USERID) values (?, ?)
insert into swas.MYSITE_RES_COHORT_GROUP_STAFF (COHORT_GROUPID, USERID) values (?, ?)
insert into swas.MYSITE_RES_COHORT_GROUP_STAFF (COHORT_GROUPID, USERID) values (?, ?)
Esto se ve muy ineficiente y está causando algunos problemas. Si se realizan varias solicitudes para agregar un empleado al grupo, algunas terminan por escrito.
Las costuras como iguales y hashCode pueden ser una razón para esto. A continuación están la implementación de estos métodos. ¿Alguna bandera roja?
CohortGroup
@Override
public int hashCode() {
final int prime = 31;
int result = getName().hashCode();
result = prime * result + ((emp == null) ? 0 : emp.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {return true;}
if (!(obj instanceof CohortGroup)) {return false;}
CohortGroup other = (CohortGroup) obj;
if(!getName().equals(other.getName())){return false;}
if (emp == null && other.getOwner() != null) {
return false;
} else if (!emp.equals(other.getOwner())) {
return false;
}
return true;
}
Empleado
@Override
public boolean equals(Object obj) {
if (this == obj) {return true;}
if (obj == null) {return false;}
if (!(obj instanceof Employee)) {return false;}
Employee other = (Employee) obj;
if (EMPLID == null && other.getEMPLID() != null) {
return false;
} else if (!EMPLID.equals(other.getEMPLID())) {
return false;
}
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((EMPLID == null) ? 0 : EMPLID.hashCode());
return result;
}
he añadido un método addMember a la CohortGroup que se suma a ambos lados de la relación:
public void addMember(Employee emp){
this.getMembers().add(emp);
emp.getMemberGroups().add(this);
}
Continuación gracias a todos los que Están ayudando.
Sí, tengo el mismo comportamiento. Acabo de aprender a vivir con eso :-) Ocurre cuando configuras una Lista/Set en una clave externa –
Entonces, ¿qué haces para vivir con ella? Reduzca la velocidad de la interfaz de usuario para evitar que suceda. Tengo una aplicación ajax que puede tomar estas solicitudes tan rápido como el usuario pueda hacer clic. Esto causa algunas fallas intermitentes en las inserciones. – Mark
Tuve más o menos el mismo problema ... ¡Ten fe! http://stackoverflow.com/questions/179259 – Yuval