在删除父项时,子项正在更新而不是删除

时间:2013-02-15 10:13:49

标签: hibernate hibernate-mapping

我的问题是,当我删除父项时,不删除父项而不是删除子项,子项正在更新 这是输出

Hibernate: update employee_project set employeeNumber=null where employeeNumber=?
Hibernate: delete from employee where EMPLOYEE_NUMBER=?

当我删除父母时,这是我运行的代码片段

 public boolean deleteEmployee(Employee employee) {
        Transaction transaction = null;
        boolean flag;
        try {
            transaction = session.beginTransaction();
            session.delete(employee);
            session.flush();
            transaction.commit();
            flag = true;
        } catch (HibernateException exception) {
            if (transaction != null)
                transaction.rollback();
            flag = false;
        }
        return flag;
    }

这是我的父表Employee.hbm.xml

    

<hibernate-mapping package="com.nousinfo.tutorial.model">
    <class name="Employee" table="employee">
        <meta attribute="class-description">
            This class contains the employee detail
        </meta>
        <id name="employeeNumber" type="int" column="EMPLOYEE_NUMBER">

        </id>
        <property name="firstName" type="string" column="FIRST_NAME"></property>
        <property name="lastName" type="string" column="LAST_NAME"></property>
    </property>
        <set name="employeeProjects" cascade="all-delete-orphan">
            <key column="employeeNumber" />
            <one-to-many class="com.ravindrainfo.tutorial.model.EmployeeProject" />
        </set>

    </class>

</hibernate-mapping>

这是子表project.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.nousinfo.tutorial.model">
    <class name="EmployeeProject" table="employee_project">
        <meta attribute="class-description">
            This class contains the employee detail
        </meta>
        <composite-id>
            <key-property name="employeeNumber" type="int"
                column="EMPLOYEE_NUMBER"></key-property>
            <key-property name="projectCode" type="string" column="PROJECT_CODE"></key-property>
        </composite-id>
        <property name="startDate" type="date" column="START_DATE"></property>

        <many-to-one name="employee" class="com.ravindrainfo.tutorial.model.Employee"></many-to-one>
    </class>
</hibernate-mapping>

这是我的员工Pojo

import java.io.Serializable;
import java.util.Date;

import java.util.Set;

public class Employee implements Serializable {

    private static final long serialVersionUID = 4314638638373270669L;
    private int employeeNumber;
    private String firstName;
    private String lastName;
        private Set<EmployeeProject> employeeProjects;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
        public Set<EmployeeProject> getEmployeeProjects() {
        return employeeProjects;
    }

    public void setEmployeeProjects(Set<EmployeeProject> employeeProjects) {
        this.employeeProjects = employeeProjects;
    }
        public int getEmployeeNumber() {
        return employeeNumber;
    }

    public void setEmployeeNumber(int employeeNumber) {
        this.employeeNumber = employeeNumber;
    }

}

2 个答案:

答案 0 :(得分:0)

我不确定这也适用于xml,但尝试修改

<set name="employeeProjects" cascade="all-delete-orphan">
      <key column="employeeNumber" />
      <one-to-many class="com.ravindrainfo.tutorial.model.EmployeeProject" />
</set>

<击>与

<击>
<set name="employeeProjects" cascade="all-delete-orphan" orphanRemoval="true">
      <key column="employeeNumber" />
      <one-to-many class="com.ravindrainfo.tutorial.model.EmployeeProject" />
</set>

所以添加orphanRemoval="true"

这适用于注释@OneToMany(orphanRemoval=true),所以我很确定它也适用于xml(实际上你甚至可以安全地删除cascade="all-delete-orphan"

编辑:我查看了更多信息并找到了此页面Hibernate Unidirectional Parent/Child relationship - delete() performs update on child table instead of delete,因此您可以尝试修改添加inverse="true"而不是orphanRemoval的地图。所以

<set name="employeeProjects" cascade="all-delete-orphan" inverse="true">
    <key column="employeeNumber" />
    <one-to-many class="com.ravindrainfo.tutorial.model.EmployeeProject" />
</set>

答案 1 :(得分:0)

我认为级联应该是 all,delete-orphan 而不是 all-delete-orphan

摘自hibernate文档:

  

如果子对象的生命周期受到生命周期的限制   父对象,通过指定使其成为生命周期对象   级联= “全删除,孤儿”(@一对多(级联= CascadeType.ALL,   orphanRemoval =真))。

参考:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/objectstate.html#objectstate-transitive