Hibernate 多对多 删除中间表。

xgj1988 2010-07-16
首先我们先说一下。 我这里有个代码就多对多的,人员对部门(不要在这问题上发生疑问,什么数据库设计不好之类的,怎么人员和部门多对多,我这里声明,数据库设计没问题,具体需求不相赘述)。

给一个人员信息更新的代码。

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_=?
这样一条就搞定了。。希望谁讲解一下。谢谢
ArdenL 2010-08-13
你可以考虑用触发器嘛! 我只是建议,不要单一使用一种技术策略,推荐 应用程序和数据库综合策略

比如,你可以收集所有要删除的 userID
然后:
      delete from userTable where userId in(id1,kd2.....),
   
在你的 m:n 的 user-department 表上建立一个删除的触发器应该可以搞定。

楼主可以试试。
Global site tag (gtag.js) - Google Analytics