虽然删除了父母,孩子被更新,而不是删除
我的问题是,当我删除父子并没有被删除,而不是删除了孩子,孩子正在更新 这是输出虽然删除了父母,孩子被更新,而不是删除
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;
}
}
我不知道这个工程以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()这有什么区别? – user1527637 2013-02-15 10:28:39
不,它不应该。Hibernate发出查询'update employee_project set employeeNumber = null where employeeNumber =?',这样就可以看到你的级联。看看[api](http://docs.jboss.org/hibernate/orm/4.0/javadocs/org/hibernate/metamodel/binding/CascadeType.html),看起来你的例子应该像你期望的那样工作,但试试将cascade =“all-delete-orphan”'修改为'cascade =“delete-orphan”'。对不起,我正试图从我的记忆中恢复,我很久没有使用xml了! – ThanksForAllTheFish 2013-02-15 10:36:32
我已经尝试过所有的全部删除孤儿,删除孤儿,所有,删除孤儿没有人正在工作相同的问题发生父母被删除,但孩子没有删除其更新 – user1527637 2013-02-15 10:41:26
我觉得级联应该是全部删除孤儿而不是全删除,孤儿
Hibernate文档中的摘录:
如果子对象的生命周期由父对象的生命周期限定,通过指定 cascade =“all,delete-orphan”(@ OneToMany(cascade = CascadeType.AL)将其设为生命周期对象L, orphanRemoval = true))。
仍然存在同样的问题存在孩子正在更新和它的所有,删除孤儿你的拼写错误,我认为:-P – user1527637 2013-02-15 10:37:09
你是对的拼写 - 我为了一致性,但现在我对无法工作的原因一无所知...... – Grim 2013-02-15 10:43:43
你尝试过这么远吗?您应该更改标签以获得更多合适的人员来回答您的问题。标签的一个好主意是您正在使用的语言的名称。 – 2013-02-15 10:36:27
@ProfPickle我已经添加一个标签感谢您的建议实际上这是我第一次问这个问题,这就是为什么我不知道 – user1527637 2013-02-15 10:45:01