2015-03-02 170 views
0

我正在使用與共享主鍵的一對一映射。休眠一對一映射錯誤

我的映射是類似的東西 -

<class name="EmployeeDetails" table="EMPLOYEE_DETAILS" > 
    <cache usage="nonstrict-read-write"/> 
    <id name="employeeId" type="java.lang.Long"> 
     <column name="EMPLOYEE_ID" precision="12" scale="0" /> 
     <generator class="foreign"> 
      <param name="property">employee</param> 
     </generator> 
    </id> 
    <property name="score" type="java.math.BigDecimal" update="true"> 
     <column name="SCORE" /> 
    </property> 
    <one-to-one name="employee" class="Employee" constrained="true"/> 
</class> 

和Employee.hbm.xml我有

<one-to-one name="employeeDetails" class="EmployeeDetails" cascade="all,delete-orphan"></one-to-one> 

我只設置employee.setEmployeeDetails(new EmployeeDetails(score)); 並嘗試保存員工。 查詢觸發了更新查詢,但EMPLOYEE_DETAILS表中沒有記錄。我希望它被插入。我怎樣才能做到這一點?如果我使用級聯級聯=「save-update」,我不會收到任何錯誤。如果我使用級聯=「保存更新」我得到一個錯誤No row with the given identifier exists 但這兩次它只觸發更新查詢。

+0

您可以嘗試與http://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example/進行比較 – 2015-03-03 11:19:13

回答

0

我能解決這個問題像下面 -

 EmployeeDetails employeeDetails= employee.getEmployeeDetails(); 

     if(employeeDetails!= null){ 
      employeeDetails.setScore(statusVO.getScore()); 
     } 
     else { 
      employeeDetails = new EmployeeDetails(statusVO.getScore()); 
      employeeDetails.setEmployee(employee); 
     } 
     employeeDetailsService.saveOrUpdate(employeeDetails); 

的關鍵是,當employeeDetails在數據庫中存在(並因此在Employee對象),那麼只需更新的屬性,並且當它不僅樹立員工對象休眠會照顧從僱員對象拾取正確的ID插入。