当前位置: 首页 > 面试题库 >

将hibernate插入到集合中会导致删除,然后再次插入集合中的所有项目

柳项明
2023-03-14
问题内容

我与CohortGroup和Employee有很多关系。每当我将Employee插入CohortGroup时,hibernate都会从解析表中删除该组,然后再次插入所有成员以及新成员。为什么不只是添加新的呢?

组中的注释:

@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之类的接缝可能是造成这种情况的原因。下面是这些方法的实现。有没有危险信号?

同类群组

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

}

继续感谢所有正在提供的帮助。


问题答案:

我有插入片段,以现在期望的方式运行。感谢Pascal和z5h,我学到了很多东西。我相信我的hashCode和equals正确实现。但这从来没有为我解决问题。相反,我实现了一个中间实体。

对于下面的内容,我的Employee,CohortGroup和现在的CohortGroupMemeber类中的映射是值得的。

雇员:

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

同类群组成员

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

同类群组

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

我为此编写的书是《 Java Persistence with Hibernate》第7.2.3章。



 类似资料:
  • 问题内容: 我与CohortGroup和Employee有很多关系。每当我将Employee插入CohortGroup时,冬眠都会从解析表中删除该组,然后再次插入所有成员,再加上新成员。为什么不只是添加新的呢? 组中的注释: 员工的另一边 代码嗅探 下面是日志中报告的SQL 这种接缝的效率很低,并且会引起一些问题。如果有人提出将某员工添加到该组的要求,那么有些人将被改写。 诸如equals和has

  • 问题内容: 我有一个关于Hibernate 3.6.7和JPA 2.0的问题。 考虑以下实体(为简洁起见,省略了一些getter和setter方法): 现在考虑这段代码: 子实体错误地两次插入到父实体的子实体列表中。 执行以下操作之一时,代码可以正常工作(列表中没有重复的条目): 删除父实体中的属性 在子级列表上执行一些读取操作(例如,用标记的取消注释行) 这显然是非常奇怪的行为。同样,当使用Ec

  • 我有一个mongoose模式,看起来如下所示: ); 我需要将数据推送到这个架构。 } 此数据推送到数据库后3天必须删除。如何在Node.js中实现?我发现它真的很混乱,试了很多代码。如有任何回答,我们将不胜感激!谢谢 附注。我使用mongoDb图集

  • 我试图在集合中插入一个对象,我重载了' 但我仍然得到以下错误: /home/joju/NetBeansProjects/cppu 1/main。cpp:51:对“domino::domino(int,int)”的未定义引用 build/Debug/GNU-Linux-x86/main。o:在函数`std::less::operator()(domino const)中 /usr/include/c

  • 问题内容: 我有这些实体 使用此映射(对不起,没有注释,我是老式的): 我还在2列上有一个唯一约束:和(不是每个约束都有唯一约束,但是包含两个约束都没有唯一约束,例如,不允许2行具有相同的父对象和相同的localIdentifier) 以及使用它们的这段代码: 现在,由于某种原因,Hibernate不会按调用顺序执行事情。它不会在(插入)之前执行(删除),反之亦然,它首先尝试插入,得到一个 我知道

  • 问题内容: 我正在寻找清除整个收藏夹的方法。我看到有一个批处理更新选项,但这需要我知道集合中的所有文档ID。 我正在寻找一种简单地删除集合中每个文档的方法。 谢谢! 编辑:下面的答案是正确的,我使用以下方法: 问题答案: 没有API可以一次性删除整个集合(或其内容)。 从Firestore文档中: 要在Cloud Firestore中删除整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。