休眠插入到集合导致删除,然后再次插入集合中的所有项目 [英] hibernate insert to a collection causes a delete then all the items in the collection to be inserted again

查看:116
本文介绍了休眠插入到集合导致删除,然后再次插入集合中的所有项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有许多可能的关系组群和员工。任何时候,我将Employee插入到CohortGroup中,hibernate会从解析表中删除组,并再次插入所有成员,再加上新的成员。为什么不添加新的?



组中的注释:

  @JoinTable(name =MYSITE_RES_COHORT_GROUP_STAFF,
joinColumns = {@ JoinColumn(name =COHORT_GROUPID)},
inverseJoinColumns = {@ JoinColumn(name =USERID)})
public List< Employee> getMembers(){
返回成员;

$ / code>

员工的另一面

  @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

 从swas.MYSITE_RES_COHORT_GROUP_STAFF中删除,其中COHORT_GROUPID =? 
插入swas.MYSITE_RES_COHORT_GROUP_STAFF(COHORT_GROUPID,USERID)值(?,?)
插入到swas.MYSITE_RES_COHORT_GROUP_STAFF(COHORT_GROUPID,USERID)值(?,?)
插入到swas.MYSITE_RES_COHORT_GROUP_STAFF(? (?,?)
插入swas.MYSITE_RES_COHORT_GROUP_STAFF(COHORT_GROUPID,USERID)值(?,?)
插入到swas.MYSITE_RES_COHORT_GROUP_STAFF(COHORT_GROUPID,USERID)
插入swas.MYSITE_RES_COHORT_GROUP_STAFF(COHORT_GROUPID,USERID)值(?,?)

接缝真的效率低下,并造成一些问题。如果有一些要求将员工添加到组中,则有些请求会被写入。



像equals和hashCode这样的接口可能是造成这种情况的原因。以下是这些方法的实现。任何红旗?



CohortGroup

  @Override 
public int hashCode(){
final int prime = 31;
int result = getName()。hashCode();
result = prime * result +((emp == null)?0:emp.hashCode());
返回结果;

@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){
返回false;
} else if(!emp.equals(other.getOwner())){
return false;
}
返回true;

员工



<$ p ($ obj){返回true;}
if(obj == null)
$ b $ public boolean equals(Object obj){
if(this == obj){return true; {返回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;
}
返回true;
}

@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result +((EMPLID == null)?0:EMPLID.hashCode());
返回结果;
}

我在CohortGroup中添加了一个addMember方法,关系:

  public void addMember(Employee emp){
this.getMembers()。add(emp);
emp.getMemberGroups()。add(this);

}

继续感谢所有帮助。

解决方案

我按照我期望的方式执行插入操作。感谢Pascal和z5h,我学到了很多东西。我相信我有hashCode和等于正确实施。尽管如此,这从来没有解决过这个问题。相反,我已经实施了一个中间实体。



以下是我的员工,CohortGroup和现在的CohortGroupMemeber类中的映射。



Employee:

  @OneToMany(mappedBy =member)
public List< CohortGroupMember> getMemberGroups(){
return memberGroups;
}
public void setMemberGroups(List< CohortGroupMember> grps){
memberGroups = grps;

CohortGroupMember

  @ManyToOne 
@JoinColumn(name =USERID)
public Employee getMember(){
return emp;
}
public void setMember(Employee e){
emp = e;

@ManyToOne
@JoinColumn(name =COHORT_GROUPID)
public CohortGroup getGroup(){
return group;
}
public void setGroup(CohortGroup cg){
group = cg;

CohortGroup

  @OneToMany(mappedBy =group)
public List< CohortGroupMember> getMembers(){
返回成员;
}
public void setMembers(List< CohortGroupMember> emps){
members = emps;

我遵循的这本书是Java Persistence with Hibernate chapter 7.2.3


I have a many to may relationship CohortGroup and Employee. Any time I insert an Employee into the CohortGroup hibernate deletes the group from the resolution table and inserts all the members again, plus the new one. Why not just add the new one?

The annotation in the Group:

@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;
}

The other side in the Employee

@ManyToMany(mappedBy="members",cascade = { PERSIST, MERGE, REFRESH } )
public List<CohortGroup> getMemberGroups(){
  return memberGroups;
}

Code snipit

Employee emp = edao.findByID(cohortId);
CohortGroup group = cgdao.findByID(Long.decode(groupId));
group.getMembers().add(emp);
cgdao.persist(group);

below is the sql reported in the log

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 (?, ?)

This seams really inefficient and is causing some issues. If sevral requests are made to add an employee to the group then some get over written.

Seams like equals and hashCode might be a reason for this. Below are the implementation for these methods. Any red flags?

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;
}

Employee

       @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;
}

I have added an addMember method to the CohortGroup that adds to both sides of the relationship:

    public void addMember(Employee emp){
    this.getMembers().add(emp);
    emp.getMemberGroups().add(this);

}

Continued thanks to all that are helping.

解决方案

I have inserts acting the way I expect them to now. Thanks to Pascal and z5h, I have learned a lot. I believe I have the hashCode and equals implemented correctly. This never solved the problem for me though. Instead I have implemented an Intermediate Entity.

For what it is worth below are the mapping in my Employee, CohortGroup, and now CohortGroupMemeber classes.

Employee:

@OneToMany(mappedBy="member")
public List<CohortGroupMember> getMemberGroups(){
   return memberGroups;
}
public void setMemberGroups(List<CohortGroupMember> grps){
   memberGroups = grps;
}

CohortGroupMember

@ManyToOne
@JoinColumn(name="USERID")
public Employee getMember(){
    return emp;
}
public void setMember(Employee e){
    emp = e;
}
@ManyToOne
@JoinColumn(name="COHORT_GROUPID")
public CohortGroup getGroup(){
    return group;
}
public void setGroup(CohortGroup cg){
    group   = cg;
}

CohortGroup

@OneToMany(mappedBy="group")
public List<CohortGroupMember> getMembers(){
    return members;
}
public void setMembers(List<CohortGroupMember> emps){
    members = emps;
}

The book I followed for this is Java Persistence with Hibernate chapter 7.2.3

这篇关于休眠插入到集合导致删除,然后再次插入集合中的所有项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆