2014-09-24 124 views
0

我有以下課程。休眠父/子關聯。更新父母讓孩子失去了所有相關的對象

public class Employee { 
    private int id; 
    private String firstName; 
    private String lastName; 
    private Address address; 
    private Employer employer; 
} 

public class Employer { 
    private int id; 
    private String name; 
    private Set<Employee> employees; 
} 

public class Address { 
    private int id; 
} 
public class Project{ 
    private int id; 
} 

<hibernate-mapping> 
    <class name="me.hibernate.basic.xml.Employee" table="EMPLOYEE"> 
     <id name="id" type="int" column="id"> 
      <generator class="native" /> 
     </id> 
     <property name="firstName" column="first_name" type="string" /> 
     <property name="lastName" column="last_name" type="string" /> 
     <many-to-one name="address" column="address" unique="true" class="me.hibernate.basic.xml.Address"/> 
     <set name="projects" cascade="save-update, delete-orphan" sort="natural"> 
      <key column="employee_proj_id" /> 
      <one-to-many class="me.hibernate.basic.xml.Project" /> 
     </set> 
     <many-to-one name="employer" column="employer" class="me.hibernate.basic.xml.Employer"/> 
    </class> 
</hibernate-mapping> 



<hibernate-mapping> 
    <class name="me.hibernate.basic.xml.Employer" table="EMPLOYER"> 
     <id name="id" type="int" column="id"> 
      <generator class="native" /> 
     </id> 
     <property name="name" column="name" type="string" /> 
     <set name="employees" cascade="save-update, delete-orphan" table="EMPLOYEE"> 
      <key column="employer"/> 
      <one-to-many class="me.hibernate.basic.xml.Employee" /> 
     </set> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="me.hibernate.basic.xml.Address" table="ADDRESS"> 
     <meta attribute="class-description"> This class contains the address detail. </meta> 
     <id name="id" type="int" column="id"> 
      <generator class="native" /> 
     </id> 
    </class> 
</hibernate-mapping> 

    <hibernate-mapping> 
     <class name="me.hibernate.basic.xml.Project" table="PROJECT"> 
      <meta attribute="class-description"> This class contains the project detail. </meta> 
      <id name="id" type="int" column="id"> 
       <generator class="native" /> 
      </id> 
     </class> 
    </hibernate-mapping> 

在我的應用程序中,我創建了幾個員工併爲他們分配一個地址。並添加一些項目。然後,我創建一個僱主,並將所有員工添加到僱主。一旦我添加員工並更新僱主,所有員工都會失去他們的地址和項目。我怎樣才能做到這一點,保持延遲加載功能。我不需要設置lazy =「false」。

Employee emp1 = ME.addEmployee("Zara", "Ali"); 
Employee emp2 = ME.addEmployee("Daisy", "Das"); 

Address addr1 = ME.addAddress(35, "xxxxxx Street", "XXXXX", "XY7 0ZZ"); 
Address addr2 = ME.addAddress(42, "xxxxxx Street", "XXXXX", "XY7 7ZZ"); 
ME.setAddress(emp1.getId(), addr1); 
ME.setAddress(emp2.getId(), addr2); 

Set<Project> proj = new HashSet<Project>(); 
proj.add(new Project("NOVA")); 
proj.add(new Project("GTA Simplify")); 
proj.add(new Project("Jazz")); 

ME.addProjects(emp.getId(), proj); 
ME.addProjects(emp.getId(), proj); 

所有工作到這一點。

Set<Employee> emps = new HashSet<Employee>(); 
emps.add(emp1); emps.add(emp2); 

//Add existing employees to employer - Many-to-one bidirectional 
Employer employer = ME.addEmployer("XYZ"); 
ME.addEmployees(employer.getId(), emps); 

public Integer addEmployees(Integer employerID, Set<Employee> employees) { 
Session session = factory.openSession(); 
Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 
     Employer employer = (Employer) session.get(Employer.class,employerID); 
     employer.getEmployees().clear(); 
     employer.getEmployees().addAll(employees); 
     session.update(employer); 
     tx.commit(); 
    } catch (HibernateException e) { 
    if (tx != null) 
    tx.rollback(); 
    e.printStackTrace(); 
    } finally { 
    session.close(); 
    } 
    return employerID; 
} 

一旦我加入的員工,所有的外鍵引用丟失在PROJECT.employee_proj_id和EMPLOYEE.address。

Hibernate的日誌:

->Hibernate: update EMPLOYEE set first_name=?, last_name=?, basic=?, address=?, employer=? where id=? 
->Hibernate: update EMPLOYEE set first_name=?, last_name=?, basic=?, address=?, employer=? where id=? 
->Hibernate: update PROJECT set employee_proj_id=null where employee_proj_id=? 
->Hibernate: update PROJECT set employee_proj_id=null where employee_proj_id=? 
->Hibernate: update EMPLOYEE set employer=? where id=? ->Hibernate: update EMPLOYEE set employer=? where id=? 
+0

我可以看到下面的sql查詢被觸發。 - > Hibernate:更新EMPLOYEE set first_name =?,last_name =?,basic =?,address =?,employer =?其中id =? - > Hibernate:更新EMPLOYEE set first_name =?,last_name =?,basic =?,address =?,employer =?其中id =? - > Hibernate:update PROJECT set employee_proj_id = null where employee_proj_id =? - > Hibernate:update PROJECT set employee_proj_id = null where employee_proj_id =? - > Hibernate:更新EMPLOYEE set employer =?其中id =? - > Hibernate:更新EMPLOYEE set employer =?其中id =? – Rasika 2014-09-24 14:43:41

+0

如果我將僱主設置爲員工,而不是將僱員集合添加到僱主,則工作正常。兩種情況都是hibernate更新員工記錄。但是,只有當僱員加入僱主時,員工纔會失去他們的項目。 – Rasika 2014-09-24 16:29:52

回答

0

我看你增加更多的員工面前,這是一切的根源,你是清理員工。我不確定你在添加地址,項目,僱主等時做了什麼,你不需要清除員工。如果您在員工身上設置了cascadetype.all,則保存僱主將更新新添加的員工。

employer.getEmployees().clear();//remove this line. 
employer.getEmployees().addAll(employees);