老师开课的三元关系映射处理:
package cn.itcast.vo ;
public class Teacher extends User{ private Set courses = new HashSet() ;}
public class Course{ private int id ; private String courseName ;
public boolean equals(Object obj) { if(obj==null) return false ; if(obj==this) return true ;
if(obj instanceof Course) { Course c = (Course)obj ; if(c.getId()==id) return true ; } return false ; }
public int hashCode() { return id ; }};
public class TeacherCourse{ private int id ; private Date beginDate ; private Date endDate ; private int weekDay ; private int beginHour ; private int endHour ; private int totalStu ;
private Teacher teacher ; private Course course ;
}
User.hbm.xml中:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="vo" auto-import="true">
<class name="User" table="users" > <id name="id" column="userId"> <generator class="identity" /> </id> <property name="username" column="username" type="string"/> <property name="password" column="password" /> <property name="loginTimes" column="loginTimes" /> <property name="visitTime" column="visitTime" /> <property name="registerTime" column="registerTime" /> <joined-subclass name="Teacher" table="teachers"> <key column="userId" /> <property name="empNo" column="emp_no" /> <property name="salary" column="salary"/> //inverse的作用:更新老师的时候不写关系 <set name="courses" table="teacher_course" inverse="true" cascade="none"> <key column="user_id" /> <many-to-many class="Course" column="course_id"/> </set> //老师与课程之间的关系是多对多的,而且老师持有课程,其实从设计的角度讲,应该让 //老师持有关系表 </joined-subclass>
<joined-subclass name="Student" table="students"> <key column="userId" /> <property name="stuNo" column="stu_no" /> <property name="grade" column="grade"/> </joined-subclass> </class>
<class name="Course" table="courses"> <id name="id" column="course_id"> <generator class="identity" /> </id> <property name="courseName" column="course_name" /></class>
<class name="TeacherCourse" table="teacher_course"> <id name="id" column="tea_cor_id"> <generator class="identity" /> </id> <property name="beginDate" column="begin_date" /> <property name="endDate" column="end_date" /> <property name="weekDay" column="week_day" /> <property name="beginHour" column="begin_hour" /> <property name="endHour" column="end_hour" /> <property name="totalStu" column="total_stu" />
<many-to-one name="teacher" column="user_id" /> <many-to-one name="course" column="course_id" /></class>
</hibernate-mapping>
teacher文件夹里面的index.jsp:<a href="${pageContext.request.contextPath}/teacher/pubCourse.do">开课?</a>
//找出所有课程和该老师开的所有课程……注意下面的Action的配置要放到teacher的配置文件里面!
处理pubCourse.do地址的Action不需要formbean,成功后转向pubCourse.jsp
public class PubCourseAction { public ActionForward execute() { SessionFactory factory = ……………… Session session = factory.getCurrentSession();
session.beginTransaction() ; Teacher teacher = (Teacher)request.getSession().getAttribute("teacher"); Query q = session.createQuery("from Course"); request.setAttribute("allCourses",q.list()); session.lock(teacher,LockMode.NONE); Hibernate.initialize(teacher.getCourses());
session.getTransaction().commit() ; }}
pubCourse.jsp:
<body> <logic:iterate id="course" name="allCourses"> ${course.courseName} <% Teacher tea = (Teacher)session.getAttribute("teacher") ; Set courses = tea.getCourses(); Course c = (Course)pageContext.getAttribute("course"); if(courses.contains(c))//记住这里的contains用equals方法,所以前面必须重载 { %> 已开 <% }
else { %> <a href="${pageContext.request.contextPath}/teacher/pubCourseInput.jsp?id=${course.id}">开课</a> <% } %> <br> </logic:iterate></body>
==============================================================================================================================================
pubCourseInput.jsp:
<% org.apache.config.ModuleConfig mc = (ModuleConfig)application .getAttribute(org.apache.struts.Globals.MODULE_KEY+"/teacher"); request.setAttribute(Globals.MODULE_KEY,mc); //由于默认找的不是teacher模块,所以这两句代码必不可少,要不然你就通过一个.do地址先 //经过struts-config-teacher.xml%><body> <html:form action="/pubCourseSubmit"> <html:hidden property="courseId" value="${param.id}" /> //隐藏域放超级链接请求传来的课程id 开课时间:<html:text property="beginDate"/><br> 结课时间:<html:text property="endDate" /><br> 具体上课时间:每周<html:text property="weekDay" size="1"/>- <html:text property="beginHour" size="1"/>点至 <html:text property="endHour" size="1"/>点<br> <html:submit/> </html:form></body>
建立ActionForm,属于teacher模块,建立到teacher配置文件里面!属性对应好上面的表单……
然后建立Action,用来接收/pubCourseSubmit……成功后转到自己模块下面的pubCourse.do地址
//读出form中的课程idpublic class PubCourseSubmitAction extends Action{ public ActionForward execute() { PubCourseSubmitForm pf = (PubCourseSubmitForm)form ;
Course course = new Course() ; course.setId(pf.getCourseId()); Teacher teacher = (Teacher)request.getSession.getAttribute("teacher"); TeacherCourse tc = new TeacherCourse(); tc.setCourse(course); tc.setTeacher(teacher); tc.setBeginDate(pf.getBeginDate); tc.setEndDate(pf.getEndDate()); tc.setEndHour(pf.getEndHour()); tc.setBeginHour(pf.getBeginHour());
session.save(tc);
teacher.getCourses().add(course);
……………………………………………………………… session.close(); factory.close(); }}