2013-02-15 195 views
0

我的问题是,当我删除父子并没有被删除,而不是删除了孩子,孩子正在更新 这是输出虽然删除了父母,孩子被更新,而不是删除

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

} 
+0

你尝试过这么远吗?您应该更改标签以获得更多合适的人员来回答您的问题。标签的一个好主意是您正在使用的语言的名称。 – 2013-02-15 10:36:27

+0

@ProfPickle我已经添加一个标签感谢您的建议实际上这是我第一次问这个问题,这就是为什么我不知道 – user1527637 2013-02-15 10:45:01

回答

0

我不知道这个工程以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> 
+0

孤儿删除元素不支持在我的XML如果你有另一种解决方案,请给我和一个问题在我pojo类我没有覆盖equals()和hashCode()这有什么区别? – user1527637 2013-02-15 10:28:39

+0

不,它不应该。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

+0

我已经尝试过所有的全部删除孤儿,删除孤儿,所有,删除孤儿没有人正在工作相同的问题发生父母被删除,但孩子没有删除其更新 – user1527637 2013-02-15 10:41:26

0

我觉得级联应该是全部删除孤儿而不是全删除,孤儿

Hibernate文档中的摘录:

如果子对象的生命周期由父对象的生命周期限定,通过指定 cascade =“all,delete-orphan”(@ OneToMany(cascade = CascadeType.AL)将其设为生命周期对象L, orphanRemoval = true))。

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

+0

仍然存在同样的问题存在孩子正在更新和它的所有,删除孤儿你的拼写错误,我认为:-P – user1527637 2013-02-15 10:37:09

+0

你是对的拼写 - 我为了一致性,但现在我对无法工作的原因一无所知...... – Grim 2013-02-15 10:43:43