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 表上建立一个删除的触发器应该可以搞定。 楼主可以试试。 |