2月2日——培训第61天

    技术2022-05-11  75

    老师开课的三元关系映射处理:

    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(); }} 


    最新回复(0)