Hibernate 级联删除失败问题

来源:互联网 发布:python 英文分词 编辑:程序博客网 时间:2024/05/29 02:52

要求:通过删除一个部门,级联删除它的所有下级部门
部门实体:Department.java

import java.util.HashSet;import java.util.Set;/** * 部门管理 * @author Administrator * */public class Department {    private Long id;//部门id    private String name;//部门名称    private String description;//部门描述    private Set<User> users = new HashSet<User>();//用户    private Department parent;//上级部门    private Set<Department> children = new HashSet<Department>();//下级部门    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }    public Department getParent() {        return parent;    }    public void setParent(Department parent) {        this.parent = parent;    }    public Set<Department> getChildren() {        return children;    }    public void setChildren(Set<Department> children) {        this.children = children;    }    public Set<User> getUsers() {        return users;    }    public void setUsers(Set<User> users) {        this.users = users;    }   }

部门映射文件Departmetn.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.sinosoft.test.domain">    <class name="Department" table="test_department">        <id name="id">            <generator class="native"/>        </id>        <property name="name"></property>        <property name="description"></property>        <!-- users属性,本类与User的一对多关系 -->        <set name="users">            <key column="departmentId"></key>            <one-to-many class="User"/>        </set>        <!-- parent属性,本类与Department(上级)的多对一关系 -->        <many-to-one name="parent" class="Department" column="parentId"></many-to-one>        <!-- children属性,本类与Department(下级)的一对多关系        cascade = "delete" 级联删除子部门,即当删除某部门连同删除其所有子部门         -->        <set name="children" cascade="all-delete-orphan">            <key column="parentId"></key>            <one-to-many class="Department"/>        </set>                  </class></hibernate-mapping>

DepartmentAction.java

package com.sinosoft.test.view.action;import java.util.List;import javax.annotation.Resource;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.sinosoft.test.domain.Department;import com.sinosoft.test.service.DepartmentService;@Controller@Scope("prototype")public class DepartmentAction extends ActionSupport implements ModelDriven<Department> {    @Resource    private DepartmentService departmentService;    private Long parentId;    private Department model = new Department();    public Department getModel() {        return model;    }    public void setModel(Department model) {        this.model = model;    }    /**部门列表*/    public String list() throws Exception{        List<Department> departmentList = departmentService.findAll();        ActionContext.getContext().put("departmentList", departmentList);        return "list";    }    /**添加页面*/    public String addUI() throws Exception{        //准备数据        List<Department> departmentList = departmentService.findAll();        ActionContext.getContext().put("departmentList", departmentList);        return "addUI";    }    /**添加*/    public String add() throws Exception{        //封装对象到表单中        Department parent = departmentService.getById(parentId);        model.setParent(parent);        departmentService.save(model);        return "toList";    }    /**修改页面*/    public String editUI() throws Exception{        //准备数据departmentList        List<Department> departmentList = departmentService.findAll();        ActionContext.getContext().put("departmentList", departmentList);        //准备回显数据        Department department = departmentService.getById(model.getId());        ActionContext.getContext().getValueStack().push(department);        if(department.getParent() != null){            parentId = department.getParent().getId();        }        return "editUI";    }    /**修改*/    public String edit() throws Exception{        //从数据库中取出原对象        Department department = departmentService.getById(model.getId());        //设置要修改的属性        department.setName(model.getName());        department.setDescription(model.getDescription());        department.setParent(departmentService.getById(parentId));        departmentService.update(department);        return "toList";    }    /**删除*/    public String delete() throws Exception{        if(model.getId() != null){        Department department = departmentService.getById(model.getId());        departmentService.delete(department);        }        return "toList";    }    //    public Long getParentId() {        return parentId;    }    public void setParentId(Long parentId) {        this.parentId = parentId;    }}

在我第一次操作时,没有级联成功,只删除了部门记录,没有级联删除该部门的所有下级部门的记录。最后找到原因是我在DepartmentAction.java中的delete()操作错误。
第一次操作代码:

/**删除*/    public String delete() throws Exception{        departmentService.delete(model);        }        return "toList";    }

修改后:

/**删除*/    public String delete() throws Exception{        if(model.getId() != null){        Department department = departmentService.getById(model.getId());        departmentService.delete(department);        }        return "toList";    }

错误原因是,因为我第一次删除的Model中只有页面传过来本部门的id,没有要删除的子部门信息,故不能删除,所以需要通过id先把该对象加载进来如下:

Department department = departmentService.getById(model.getId());

其它情况待补充。。。。

0 0
原创粉丝点击