0

我的问题是,当我删除父级时,子级没有被删除,而是没有删除子级,子级正在更新。父表是Employee子表EmployeeProject,员工和项目之间存在一对多的关系一位员工有很多项目什么我已经完成了,请检查我在哪里弄错了这是控制台上显示的查询

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);
            transaction.commit();
            flag = true;
        } catch (HibernateException exception) {
            if (transaction != null)
                transaction.rollback();
            flag = false;
        }
        return flag;
    }

这是父表映射文件Employee.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="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>
        <set name="employeeProjects" cascade="all-delete-orphan" lazy="false"
            inverse="true">
            <key column="employeeNumber" />
            <one-to-many class="com.nousinfo.tutorial.model.EmployeeProject" />
        </set>
        <property name="address1" type="string" column="ADDRESS_1"></property>

    </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>
        <property name="endDate" type="date" column="END_DATE"></property>
        <property name="role" type="string" column="PROJECT_ROLE"></property>
        <many-to-one name="employee" class="com.nousinfo.tutorial.model.Employee" ></many-to-one>
    </class>
</hibernate-mapping>
4

2 回答 2

0

在employee.hbm.xml 中,去掉标志inverse="true" 并将级联修改为cascade="all"。在这里放 inverse="true" 意味着这个关系的所有者是 EmployeeProject 而不是 Employee 这不是我们想要的。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.nousinfo.tutorial.model.Employee" table="EMPLOYEE">
        <id type="int" name="employeeId" column="EMPLOYEE_ID"/>
        <set name="employeeProjects" cascade="all">
            <key column="EMPLOYEE_ID"/>
            <one-to-many class="com.nousinfo.tutorial.model.EmployeeProject"/>
        </set>
    </class>
</hibernate-mapping>

我还修改了键列的名称以匹配 EmployeeProject 复合 ID 中的名称,否则您将拥有 2 个具有相同信息的列。在 project.hbm.xml 中,将多对一修改如下,以获得正确的双向映射:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.nousinfo.tutorial.model.EmployeeProject" table="EMPLOYEE_PROJECT">
        <composite-id>
            <key-property type="int" name="employeeId" column="EMPLOYEE_ID"/>
            <key-property type="string" name="projectCode" column="PROJECT_CODE"/>
        </composite-id>
        <many-to-one name="employee" column="EMPLOYEE_ID" insert="false" update="false"/>
    </class>
</hibernate-mapping>
于 2013-02-15T14:14:35.457 回答
0

将您的级联从all-delete-orphan更改为delete

因为您所需要的就是当父级被删除时,所有相关的子级也应该被删除。这就是cascade=delete所做的。

cascade=all-delete-orphan也用于删除子实体,它当然适用于不同的场景。当关系被切断时它将删除子实体例如,如果从父实体的集合中删除子实体,然后在休眠会话关闭时将删除子实体。当子实体在没有父实体的情况下逻辑上不能存在时,这种级联类型很有用。

于 2013-02-15T13:04:57.410 回答