首先我们先说一下。 我这里有个代码就多对多的,人员对部门(不要在这问题上发生疑问,什么数据库设计不好之类的,怎么人员和部门多对多,我这里声明,数据库设计没问题,具体需求不相赘述)。给一个人员信息更新的代码。public void updateUser() throws RtpServiceException {
// 存放基本属性
TbRtpUserEntity userEntity = userDAO.find(userDTO.getId());
try {
userEntity.setAdmin(userDTO.getAdmin());
userEntity.setUsername(userDTO.getUsername());
userEntity.setRealname(userDTO.getRealname());
if (!StringUtils.isBlank(userDTO.getPassword())) {
userEntity.setPassword(StringUtils.processPwd(userDTO
.getPassword()));
}
} catch (Exception e) {
throw new RtpServiceException();
}
// 删除部门
userEntity.getTbRtpDepartments().clear();
if (!StringUtils.isBlank(userDTO.getDepaCodes())) {
// 添加部门
String[] depaCodes = userDTO.getDepaCodes().split(",");
for (String depaCode : depaCodes) {
userEntity.addTbRtpDepartment(departmentDAO
.findDepaByCode(depaCode));
}
}

                  printMessage(message.setSuccessMessageInfo(_("UPDATE_SUCCESS")));
}红色部分是关键。代码绝对没问题。中间由用户的hbm.xml维护,所以我userEntity.getTbRtpDepartments().clear();
能删除用户和部门之间的关系。。但是这个删除是一条一条的删除。语句是
delete tbl_user_depa where  user_id_=? and depa_id_=?
delete tbl_user_depa where  user_id_=? and depa_id_=?
delete tbl_user_depa where  user_id_=? and depa_id_=?
...
(有多少个部门就执行多少条)这个效率极低。因为我想要的是delete tbl_user_depa where  user_id_=?  
不要 depa_id_=?
这样一条就搞定了。。希望谁讲解一下。谢谢

解决方案 »

  1.   

    hibernate 面向对象 删除就是这么删的。
    和对应关系没关系。你删1个表的数据也这样。
      

  2.   

    考虑下HQL直接删除删除之后调用下  session.flush();
    session.refresh();
    以保证同步
      

  3.   

    一个人居然还可以多个部门,你们的客户NB啊直接写sql改就好了,用sqlquery接口
      

  4.   

    搜索关键字:hibernate 批量删除
      

  5.   

    得到Set<user>,去掉想删除数据对应的user ,重新给部门的Set<user> 赋值
      

  6.   

    用这样一句就行了:userEntity.setTbRtpDepartments(null);