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