需求分析:Dept是一个自关联表,子部门和父部门是同一张表。删除一个部门的信息时,首先确定它的有没有子部门,如果有子部门就先将其子部门都删除然后再删除父部门。这里就用到了递归删除的方案:
js页面:
<div class="eXtremeTable" > <table id="ec_table" class="tableRegion" width="98%" > <thead> <tr> <td class="tableHeader"><input type="checkbox" name="selid" οnclick="checkAll('id',this)"></td> <td class="tableHeader">序号</td> <td class="tableHeader">编号</td> <td class="tableHeader">上级</td> <td class="tableHeader">名称</td> </tr> </thead> <tbody class="tableBody" > <!-- links是在page工具类中分页进行了封装的 --> ${links } <!-- results是在page工具类中List<T>进行了封装的 --> <c:forEach items="${results }" var="dept" varStatus="st"> <tr class="odd" οnmοuseοver="this.className='highlight'" οnmοuseοut="this.className='odd'" align="left"> <td><input type="checkbox" name="id" value="${dept.id }"/></td> <td>${st.count }</td> <td>${dept.id }</td> <td>${dept.parent.deptName }</td> <td><a href="deptAction_toview?id=${dept.id }">${dept.deptName }</a></td> </tr> </c:forEach> </tbody> </table> </div>
这里用到了批量删除:
web层:即action中
public String delete() throws Exception { //1.得到用户所选中的id数组 String ids[] = model.getId().split(", "); //2.调用业务方法,实现删除操作 deptService.delete(Dept.class, ids); //3.跳页面 return "alist"; } service层:
public void deleteById(Class<Dept> entityClass, Serializable id) { //1.加载出当前这个部门下的所有子部门 List<Dept> deptList = baseDao.find("from Dept where parent.id=?", Dept.class, new Serializable[]{id}); //2.遍历 if(deptList!=null && deptList.size()>0){ for(Dept dept :deptList){ deleteById(Dept.class,dept.getId());// 递归删除当前这个子部门下面的子部门 } } baseDao.deleteById(entityClass, id); } public void delete(Class<Dept> entityClass, Serializable[] ids) { //baseDao.delete(entityClass, ids); for(Serializable id :ids){ deleteById(Dept.class,id);//调用上面的删除一条记录的方法 } } dao层:
//单条删除,按id public <T> void deleteById(Class<T> entityClass, Serializable id); //批量删除 public <T> void delete(Class<T> entityClass, Serializable[] ids); 将递归加到service而不加到dao层的原因是方便事务回滚。
