多對多關聯關係處理(王添樂)

1.user與task的關係是多對多的關聯關係,那麼我們建立第三張表user_task來表示這個多對多的關係。

2.在User.hbm.xml文件中寫語句:

      <set name="tasks" table="user_task" cascade="save-update" inverse="true">
        <key column="user_id"></key>
        <many-to-many column="task_id" class="com.innov8tion.pml.task.domain.Task"></many-to-many>
    </set>

3.在Task.hbm.xml文件中寫語句:

    <set name="assignees" table="user_task" cascade="save-update" lazy="false">
        <key column="task_id"></key>
        <many-to-many column="user_id" class="com.innov8tion.pml.user.domain.User"></many-to-many>
    </set>

4.這樣,我在taskServiceImpl類中就可以寫個如下方法來設置user與task之間的關係:

    public Task updateTask(Task task, Integer[] assignees){
     Task oldTask = getTaskById(task.getTaskId());
     
     //set user_task relationship
     oldTask.getAssignees().clear();                                   (1)
     if(assignees != null && assignees.length > 0){
      for(Integer userId : assignees){
       User user = userDao.getUserById(userId);
       oldTask.getAssignees().add(user);                             (2)
      }
     }
     
     Date now = new Date();
     oldTask.setProject(task.getProject());
     oldTask.setUpdateTime(now);
     oldTask.setPlanTime(task.getPlanHours(), task.getPlanMinutes());
     oldTask.setActualTime(task.getActualHours(), task.getActualMinutes());
     oldTask.setStartTime(task.getStartTime());
     oldTask.setFinishTime(task.getFinishTime());
     oldTask.setTitle(task.getTitle());
     oldTask.setDescription(task.getDescription());
     
        return this.taskDao.updateTask(oldTask); 
    }

 

    注:

    1.在Task類中定義了一個包含User類的列表,定義如下:

     private Set assignees = new HashSet();

    2.我們在userServiceImpl中,首先獲取task,此時task與Session關聯了,我們對task中的assignees 集合做任何操作,都會相應的反映到數據庫的表user_task中。

    3.在上面(1)中的意思是清除user_task中的關於oldTask中的所有記錄。如果要移除指定的記錄可以使用:
        oldTask.getAssignees().remove(Object)語句。
    4.在上面(2)中的意思是在user_task中添加一條oldTask與user的記錄。此時,因爲user是與數據庫表User相
聯繫的,所以,不會插入相應的記錄到User表中,儘管在Task.hbm.xml文件中設置了cascade="save-update"。
當然,如果user記錄與數據庫User表沒有關係,即不設置user對象userId屬性(主鍵),而是設置user的其他屬性,比如姓名和年齡等字段,那麼在(2)中執行時,還會插入一條user的記錄到User表中。

    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章