У меня есть отношения ко многим майам CohortGroup и Employee. Каждый раз, когда я вставляю сотрудника в спящий режим CohortGroup, он удаляет группу из таблицы разрешений и снова вставляет всех участников, а также нового. Почему бы просто не добавить новый?
Аннотация в группе:
@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;
}
Другая сторона в Сотруднике
@ManyToMany(mappedBy="members",cascade = { PERSIST, MERGE, REFRESH } )
public List<CohortGroup> getMemberGroups(){
return memberGroups;
}
Код снипита
Employee emp = edao.findByID(cohortId);
CohortGroup group = cgdao.findByID(Long.decode(groupId));
group.getMembers().add(emp);
cgdao.persist(group);
ниже sql сообщается в журнале
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 (?, ?)
Этот шов действительно неэффективен и вызывает некоторые проблемы. Если делается несколько запросов на добавление сотрудника в группу, то некоторые из них переписываются.
Причиной этому могут быть такие швы, как equals и hashCode. Ниже приведена реализация этих методов. Есть красные флаги?
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;
}
сотрудник
@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;
}
В CohortGroup добавлен метод addMember, который добавляет обе стороны отношения:
public void addMember(Employee emp){
this.getMembers().add(emp);
emp.getMemberGroups().add(this);
}
Продолжение спасибо всем, кто помогает.