多对多关系中,实际上,关联关系指的就是中间表,需要根据业务想清楚谁来维护中间表,这里实现的功能是学生选课,也就是说学生是主动的一方,应该由学生添加自己所选的课程,也就是说中间表数据应该由学生来维护的。

  因此可以说,关联关系应该由学生来维护,对于课程来说,关联关系就应该由对方(学生)来进行维护。

public static void main(String[] args) {
  // 学生选课操作实际上是对学生的修改操作,而不是添加。
  // 先取得一个学生
  TUser user = (TUser) HibernateSessionFactory.getSession()。get(
  TUser.class, "zhangsan");
  // // 以下int值就是该学生选择的课程编号
  // int[] courseIds = { 2, 4, 5 };
  // // 将课程id关联到学生对象中
  // for (int i = 0; i < courseIds.length; i++) {
  // int id = courseIds[i];
  // Course c = new Course();
  // c.setId(id);
  // // 把课程加入到学生选择的课程集合里
  // user.getCourses()。add(c);
  // }
  // 如果想取消这些课程,直接将集合清空
  user.getCourses()。clear();
  // 取消一部分,再添加一部分
  int[] courseIds = { 2, 3,5 };
  // 将课程id关联到学生对象中
  for (int i = 0; i < courseIds.length; i++) {
  int id = courseIds[i];
  Course c = new Course();
  c.setId(id);
  // 把课程加入到学生选择的课程集合里
  user.getCourses()。add(c);
  }
  // 调用学生的修改
  HibernateSessionFactory.getSession()。update(user);
  Transaction tx = HibernateSessionFactory.getSession()
  .beginTransaction();
  tx.commit();
  HibernateSessionFactory.closeSession();
  }
  多对多关系应用--选课功能
  首先,先要实现用户的登陆功能,当用户登陆后,列出所有课程供用户选择。
  登陆功能之前已经实现过了,因此直接将后台代码拷贝过来即可。
  登陆同时,注意,需要将之前选择的课程内容取得,并保存到user里。
  public class TUserDAOImpl implements ITUserDAO {
  public boolean isLogin(TUser user) throws Exception {
  String hql = "FROM TUser AS u WHERE u.userid = ? AND u.password = ?";
  Query query = HibernateSessionFactory.getSession()。createQuery(hql);
  query.setString(0, user.getUserid());
  query.setString(1, user.getPassword());
  List<User> allUser = query.list();
  if (allUser != null && allUser.size() > 0) {
  // 登陆成功
  // 取得查询的结果
  TUser result = (TUser) allUser.get(0);
  // 根据引用传递,将值设置到传入的user中
  user.setRealName(result.getRealName());
  user.setRegistDate(result.getRegistDate());
  user.setLastLoginDate(result.getLastLoginDate());
  // 将用户之前选择过的课程取得
  user.setCourses(result.getCourses());
  return true;
  }
  return false;
  }
  }
  登陆成功后,用户可以看到选课的连接,点这个连接,进入选课页面,选课前,需要先查询出所有课程,列表显示。
  <a href="tuser!selectCoursePre.action">选课</a>
  编写Action的方法,在这里查询所有课程信息。
  public String selectCoursePre() throws Exception {
  allCourse = ServiceFactory.getITUserServiceInstance()。selectCoursePre();
  return "select";
  }
  <result name="select">/pages/user/user_select_course.jsp</result>
  页面显示所有课程列表,通过多选框让用户选择。
  <center>
  用户登陆成功,当前登陆用户为: ${user.realName}
  <br />
  <hr />
  <br />
  <s:form action="tuser!selectCourse.action" method="post" namespace="/" theme="simple">
  可选课程:<s:checkboxlist list="allCourse" listKey="id" listValue="title" name="courseIds"></s:checkboxlist>
  <br/>
  <s:submit value="提交"></s:submit>
  </s:form>
  </center>
  提交后,完成User的修改操作,注意,需要将课程信息合并到User对象里。
  public String selectCourse() throws Exception {
  // 先取得当前登陆用户信息
  TUser loginUser = (TUser) ServletActionContext.getRequest()
  .getSession()。getAttribute("user");
  // 设置该用户选择的课程
  loginUser.getCourses()。clear();
  for (int i = 0; i < courseIds.length; i++) {
  int id = courseIds[i];
  Course c = new Course();
  c.setId(id);
  // 将课程合并到User对象中
  loginUser.getCourses()。add(c);
  }
  ServiceFactory.getITUserServiceInstance()。selectCourse(loginUser);
  // 将用户信息保存回Session
  ServletActionContext.getRequest()。getSession()。setAttribute("user",
  loginUser);
  return "forward";
  }
  <result name="forward">/forward.jsp</result>