【问题标题】:Rather than child is deleting its updating ,when parent is deleted当父级被删除时,而不是子级正在删除其更新
【发布时间】:2013-01-31 10:52:30
【问题描述】:

我的问题是当我删除父级时,子级没有被删除,而是没有删除子级,子级正在更新。父表是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>

这是子表映射文件 项目.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>

【问题讨论】:

    标签: hibernate hibernate-mapping hibernate-onetomany


    【解决方案1】:

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

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

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

    【讨论】:

    • 我尝试更改为删除,但只有父项被删除,而不是子项你能告诉我如果我不覆盖 hash() 和 equals() 方法,那么它有什么不同吗?因为我没有覆盖我的 pojo 课上的那些
    • 上面提到的删除逻辑中的另一个问题我没有将子对象添加到集合中我只是简单地传递员工对象然后不添加子对象它会从数据库中删除子记录,我已经尝试了所有,所有,删除孤儿,删除它们都不起作用我不知道问题出在哪里
    • 在删除employee之前,能否确认employee的集合中是否有project
    • DB CRUD 操作不关心 hashCodeequals
    【解决方案2】:

    在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>
    

    【讨论】:

    • 感谢您的回复,但它无法正常运行相同的查询
    • 真的是同一个查询吗?这是不可能的,因为我更改了键列名称...
    • 我做了完全相同的事情,但现在员工也没有删除现在只有这个查询正在运行 update employee_project set EMPLOYEE_NUMBER=null where EMPLOYEE_NUMBER=?我不知道为什么会发生这种情况,过去 4 天我一直遇到这个问题,我无法解决这个问题
    • 我用您的问题的简化版本编辑了我的答案(我删除了属性)。我对其进行了测试,它可以工作,删除被级联到 EmployeeProject 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2014-09-02
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多