2011-03-27 40 views
0

我使用hibernate作爲ORM框架,這是我第一次用它來寫操作。當使用struts2和休眠更新實體時得到NonUniqueObjectException

爲了這個應用,我只是使用休眠從數據庫讀取數據。

在我的Struts動作,我嘗試更新一個名爲「任務」的實體,這是在更新頁面的形式:

<s:form action="task_update" namespace="/common" cssStyle="width:95%"> 
    <s:textfield value="%{task.id}" cssStyle="display:none" name="task.id"></s:textfield> 
    <s:textfield name="task.name" value="%{task.name}" label="TaskName"/> 

    <s:select list="task.managers" 
     listKey="id" listValue="name" label="Manager" value="%{task.manage}" name="task.department.id"> 
    </s:select> 

    <s:select list="#session.current_user.departments" 
     listKey="id" listValue="name" label="Departmentn of this task" value="%{task.department.{id}}" name="task.department.id"> 
    </s:select> 
    <table> 
     <caption align="left">Steps</caption> 
     <tr> 
      <th>Name</th> 
      <th>End Time</th> 
      <th>Operators</th> 
      <th>Status</th> 
      <th>Set the order</th> 
      <th><span id="addStep" style="cursor:pointer" >Add Steps</span></th> 
     </tr> 
     <s:iterator value="task.steps"> 
      <tr class="step"> 
       <td> 
        <s:textfield name="task.steps[0].name" value="%{#this.name}" theme="simple"/> 
        <s:textfield name="task.steps[0].id" value="%{#this.id}" theme="simple" cssStyle="display:none"/> 
        <s:textfield name="task.steps[0].position" value="%{#this.position}" theme="simple" cssStyle="display:none" class="position"/> 
       </td> 
       <td><s:textfield name="task.steps[0].end" value="%{#this.end}" theme="simple"/></td> 
       <td>   
        <s:select list="allOpIndb" listKey="id" listValue="name" value="%{#this.operator.{id}}" 
         name="task.steps[0].operator.id" multiple="true" theme="simple" id="a"> 
        </s:select> 
       </td> 
       <td> 
        <s:select list="@[email protected]()" theme="simple" 
         name="task.steps[0].status" listValue="cnValue" value="%{#this.status}" id="b"/> 
       </td> 
       <td> 
        <span class="up">up</span> 
        <span class="down">down</span> 
        <span class="del">del</span> 
       </td> 
       <td></td> 
      </tr> 
     </s:iterator> 
     <tr> 
      <td colspan="6"> 
       <s:submit value="Submit"></s:submit> 
      </td> 
     </tr> 
    </table> 
</s:form> 

此頁面的整個代碼可以發現here

然後在struts2動作中,我得到由struts2創建的任務對象(以下示例中的「task」對象),並在db中找到正在更新的對象(以下示例中的「task_db」對象):

public String task_update{ 
    DozerBeanMapper dbm = new DozerBeanMapper(); 
    // the 'task' object is created by struts2 
    taskid = task.getId(); 
    String name_st = task.getName(); 
    int dep_id_st = task.getDepartment().getId(); 
    List<TaskStep> steps_st = task.getSteps(); 

    TaskDaoImpl tkDao = new TaskDaoImpl(); 
    TaskStepDaoImpl tsDao = new TaskStepDaoImpl(); 
    OperatorDaoImpl opDao = new OperatorDaoImpl(); 
    DepartmentDaoImpl depDao = new DepartmentDaoImpl(); 

    List<TaskStep> step_db = new ArrayList<TaskStep>(); 
    for (TaskStep step_st : steps_st) { 
     int tsid = step_st.getId(); 
     TaskStep ts_db = tsDao.queryStepById(tsid); 
     if (ts_db == null) { 
      ts_db = step_st; 
     } else 
      dbm.map(step_st, ts_db); 
     // sest the operators 
     List<Operator> ops_to_db = new ArrayList<Operator>(); 
     for (Operator op_st : step_st.getOperator()) { 
      ops_to_db.add(opDao.queryOperatorById(op_st.getId())); 
     } 
     ts_db.setOperator(ops_to_db); 
     step_db.add(ts_db); 
    } 
    //set the id of the task have the same id with task_db,so set its id to a unimpossible value 
    task.setId(-100); 
    //set it to null! 
    task=null; 
    Task task_db = tkDao.queryTaskById(taskid); 
    task_db.setName(name_st); 
    task_db.setDepartment(depDao.queryDepartById(dep_id_st)); 
    task_db.setSteps(step_db); 

    tkDao.updateTask(task_db); 
} 

當我提交表單時,我得到了「org.hibernate.NonUniqueObjectException:」: 具有相同標識符值的不同對象已與會話相關聯:[com.infomanager.entity.Task#4]。

我想知道爲什麼?我已將任務的ID設置爲-100,並將其設置爲空。

什麼問題?

以下是我的分貝tabls的realation船: enter image description here

而且整個項目可以在這裏找到:https://github.com/hguser/TaskManager

回答

0

基本上,休眠的意思是,你有兩個對象,其具有相同的標識符(相同的主鍵),但它們不是同一個對象。

關注此帖可能對你有幫助。 NonUniqueObjectException

只有當hibernate在會話上下文中找到具有相同標識符的兩個對象時,這個異常纔會出現。

+0

我知道什麼冬眠說,我試圖調試和發現錯誤,但我不能。在我的應用程序中更新的實體是嵌套的對象...( – hguser 2011-03-27 03:58:38