【问题标题】:While deleting the parent ,child is updating rather than deleting删除父级时,子级正在更新而不是删除
【发布时间】:2013-02-15 19:27:51
【问题描述】:

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

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

当我删除父级时,这是我运行的代码的 sn-p

 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;
    }

}

【问题讨论】:

  • 到目前为止你尝试过什么?您应该更改标签以让更多合适的人回答您的问题。标签的一个好主意是您使用的语言的名称。
  • @ProfPickle 我已经添加了一个标签感谢您的建议实际上这是我第一次提出问题,这就是我不知道的原因

标签: hibernate hibernate-mapping


【解决方案1】:

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

来自休眠文档的摘录:

如果子对象的生命周期受其生命周期的限制 父对象,通过指定使其成为生命周期对象 cascade="all,delete-orphan"(@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true))。

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

【讨论】:

  • 仍然存在同样的问题,孩子正在更新,它的全部,删除-孤儿你的拼写是错误的我认为:-P
  • 你的拼写是对的——为了保持一致,我把它修好了,但现在我对它不起作用的原因一无所知......
【解决方案2】:

我不确定这也适用于 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>

【讨论】:

  • 孤儿删除元素在我的 XML 中不支持如果您有另一种解决方案,请在我的 pojo 类中提供我和另一个问题,我没有覆盖 equals() 和 hashCode() 这有什么不同吗?
  • 不,不应该。 Hibernate 发出查询update employee_project set employeeNumber=null where employeeNumber=?,因此它可以看到您的级联。查看api,您的示例似乎实际上应该按您的预期工作,但尝试将cascade="all-delete-orphan" 修改为简单的cascade="delete-orphan"。抱歉,我正在努力恢复记忆,好久没用xml了!
  • 我已经尝试了所有,all-delete-orphan,delete-orphan,all,delete-orphan 他们都没有工作同样的问题发生父母被删除但孩子没有被删除它的更新
  • 编辑了我的答案。让我知道这项工作是否可行,老实说,我没有其他想法!
  • 我已经尝试过这个 inverse="true" 但是当我这样做时,在控制台中只删除 EMPLOYEE_NUMBER=?显示和父被删除但子未被删除
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 2021-12-02
  • 2014-09-02
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多