多对多关系中,实际上,关联关系指的就是中间表,需要根据业务想清楚谁来维护中间表,这里实现的功能是学生选课,也就是说学生是主动的一方,应该由学生添加自己所选的课程,也就是说中间表数据应该由学生来维护的。
因此可以说,关联关系应该由学生来维护,对于课程来说,关联关系就应该由对方(学生)来进行维护。
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>