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表中。