Hibernate 当父项被删除时,而不是子项正在删除其更新
我的问题是当我删除父对象时,子对象不会被删除,而是会删除子对象,子表正在更新。父表是Hibernate 当父项被删除时,而不是子项正在删除其更新,hibernate,hibernate-mapping,hibernate-onetomany,Hibernate,Hibernate Mapping,Hibernate Onetomany,我的问题是当我删除父对象时,子对象不会被删除,而是会删除子对象,子表正在更新。父表是Employee,子表是EmployeeProject员工和项目之间存在一对多关系一名员工有多个项目我做了什么请检查我错在哪里这是控制台上显示的查询 Hibernate: update employee_project set employeeNumber=null where employeeNumber=? Hibernate: delete from employee where EMPLOYEE_NUMB
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>
此类包含员工详细信息
将级联从全部删除孤立项更改为删除
因为您所需要的是,当父对象被删除时,所有相关的子对象也应该被删除。这就是cascade=delete所做的
cascade=all delete orphan也用于删除子实体,它当然适用于不同的场景。当关系被切断时,它将删除子实体。例如,如果从父实体中的集合中删除子实体,则当hibernate会话关闭时,子实体将被删除。当子实体逻辑上没有父实体就无法存在时,此级联类型非常有用。在employee.hbm.xml中,删除标志inverse=“true”并将级联修改为cascade=“all”。在这里输入reverse=“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中的名称相匹配,否则将有两列具有相同的信息。
在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>
我尝试更改为delete,但只删除了父项而不是子项。如果我不重写hash()和equals()方法,您能告诉我这有什么区别吗?因为我没有覆盖我的pojo类中的那些,在删除逻辑中还有一个问题,如上所述,我没有将子对象添加到集合中,我只是简单地传递employee对象,然后不添加子对象,它从数据库中删除子记录,我尝试了all,all,delete orphan,删除它们都不起作用我不知道问题发生在哪里在删除员工之前,您能否确认employee中的集合中是否有任何项目。DB CRUD操作不关心hashCode或equals。感谢您的回复,但它不起作用相同的查询正在运行真的是完全相同的查询吗?这是不可能的,因为我更改了键列名…我做了完全相同的事情,但现在employee也没有删除,现在只有此查询正在运行update employee_项目集employee_NUMBER=null,其中employee_NUMBER=?我不知道为什么会发生这种情况我在过去的4天里一直遇到这个问题我无法解决这个问题我用你的问题的简化版本编辑了我的答案(我删除了属性)。我对它进行了测试,结果正常,删除被级联到EmployeeProject类。