Ich habe eine viele, Mai-Beziehung CohortGroup und Mitarbeiter. Jedes Mal, wenn ich einen Mitarbeiter in die CohortGroup-Gruppe einfüge, löscht der Hibernate die Gruppe aus der Auflösungstabelle und fügt alle Mitglieder sowie die neue Gruppe erneut ein. Warum nicht einfach das neue hinzufügen?Hibernate einfügen in eine Sammlung verursacht ein Löschen dann alle Elemente in der Sammlung wieder eingefügt werden
Die Anmerkung in der Gruppe:
@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;
}
Die andere Seite in der Employee
@ManyToMany(mappedBy="members",cascade = { PERSIST, MERGE, REFRESH })
public List<CohortGroup> getMemberGroups(){
return memberGroups;
}
-Code
snipitEmployee emp = edao.findByID(cohortId);
CohortGroup group = cgdao.findByID(Long.decode(groupId));
group.getMembers().add(emp);
cgdao.persist(group);
unten ist die SQL im Protokoll gemeldet
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 (?, ?)
Dies scheint sehr ineffizient und verursacht einige Probleme. Wenn mehrere Anträge gestellt werden, um einen Mitarbeiter zur Gruppe hinzuzufügen, werden einige überschrieben.
Seams wie equals und hashCode könnten ein Grund dafür sein. Im Folgenden finden Sie die Implementierung für diese Methoden. Irgendwelche roten Fahnen?
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;
}
Mitarbeiter
@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;
}
ich eine addMember Methode zum CohortGroup hinzugefügt haben, die zu beiden Seiten der Beziehung ergänzt:
public void addMember(Employee emp){
this.getMembers().add(emp);
emp.getMemberGroups().add(this);
}
Fortsetzung Dank an alle, dass helfen.
Ja, ich habe das gleiche Verhalten. Ich habe gerade gelernt, damit zu leben :-) Es passiert, wenn Sie eine Liste/Set auf einen Fremdschlüssel setzen –
Also, was machst du damit zu leben? Verlangsamen Sie die Benutzeroberfläche, um dies zu verhindern. Ich habe eine Ajax-App, die diese Anfrage so schnell aufnehmen kann, wie der Benutzer klicken kann. Dies verursacht einige intermittierende Fehler an den Einsätzen. – Mark
Ich hatte mehr oder weniger das gleiche Problem ... Habe Vertrauen! http://StackOverflow.com/Questions/179259 – Yuval