多对多关联关系处理(王添乐)

来源:互联网 发布:阿里云服务器租用协议 编辑:程序博客网 时间:2024/06/05 07:24

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

    

 

原创粉丝点击