2015-03-02 137 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插入。