【学生】和【课程】,一个学生可以选多门课程,一门课程可以被多个学生选,学生和课程就是多对多的关系,建个中间表【选课信息】,里面放学生的id和课程的id,那么【学生】和【选课信息】是一对多的关系,而【课程】和【选课信息】也是一对多的关系 。我现在用的是hibernate 映射,我现在有个问题,怎么样通过学生ID,找到它所有的课程名称?

解决方案 »

  1.   

    晕,很简单么, 通过学生id 找到所有课程ID , 因为1对多 所以找到多个课程id,在通过课程id关联课程表找出课程名称。不知道你问的是不是这个。
      

  2.   

    200分求hibernate的一个小问题[问题点数:100分]楼主,难道是我不认识数 了???
      

  3.   

    双向关联
    生成第三张表【选课信息】表
    具体代码如下实体类:1.course
    package com.ywjava.course;import java.util.HashSet;
    import java.util.Set;public class Course {
    private Long oid; private String cid; private String name; // 关联属性
    private Set<Student> stus = new HashSet<Student>(); public Course() {
    super();
    } public Course(String cid, String name) {
    super();
    this.cid = cid;
    this.name = name;
    } public String getCid() {
    return cid;
    } public void setCid(String cid) {
    this.cid = cid;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Long getOid() {
    return oid;
    } public void setOid(Long oid) {
    this.oid = oid;
    } public Set<Student> getStus() {
    return stus;
    } public void setStus(Set<Student> stus) {
    this.stus = stus;
    } @Override
    public int hashCode() {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + ((cid == null) ? 0 : cid.hashCode());
    return result;
    } @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    final Course other = (Course) obj;
    if (cid == null) {
    if (other.cid != null)
    return false;
    } else if (!cid.equals(other.cid))
    return false;
    return true;
    }}2.studentpackage com.ywjava.student;import java.util.HashSet;
    import java.util.Set;public class Student {
    private Long oid; private String sid; private String name; // 关联属性
    private Set<Course> cours = new HashSet<Course>(); public Student() {
    super();
    } public Student(String sid, String name) {
    super();
    this.sid = sid;
    this.name = name;
    } public Set<Course> getCours() {
    return cours;
    } public void setCours(Set<Course> cours) {
    this.cours = cours;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Long getOid() {
    return oid;
    } public void setOid(Long oid) {
    this.oid = oid;
    } public String getSid() {
    return sid;
    } public void setSid(String sid) {
    this.sid = sid;
    } @Override
    public int hashCode() {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + ((sid == null) ? 0 : sid.hashCode());
    return result;
    } @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    final Student other = (Student) obj;
    if (sid == null) {
    if (other.sid != null)
    return false;
    } else if (!sid.equals(other.sid))
    return false;
    return true;
    }}配置文件:course.hbn.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.ywjava.course">
       <class name="Course" table="t_course_many2many">
          <id name="oid" column="OID">
             <generator class="hilo">
                <param name="table">t_hilo_many2many</param>
                <param name="column">HIGH</param>
             </generator>
          </id>
          <property name="cid"
                    column="COURSE_ID"
                    unique="true"
                    not-null="true" />
          <property name="name"
                    column="NAME" 
                    not-null="true"/>
                    
          <set name="stus" 
               table="t_enrollment_m2m"
               inverse="true">
             <key column="CFK" />
             <many-to-many class="Student" 
                           column="SFK"/>
          </set> 
                    
                    
                    
                    
                    
                    
                    
       </class>
    </hibernate-mapping>student.hnb.xml<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.ywjava.student">
       <class name="Student" table="t_student_many2many">
          <id name="oid" column="OID">
             <generator class="hilo">
                <param name="table">t_hilo_many2many</param>
                <param name="column">HIGH</param>
             </generator>
          </id>
          <property name="sid"
                    column="STUDENT_ID"
                    unique="true"
                    not-null="true" />
          <property name="name"
                    column="NAME" 
                    not-null="true"/>
                    
          <set name="cours" 
               table="t_enrollment_m2m"
               >
             <key column="SFK" />
             <many-to-many class="Course" 
                           column="CFK"/>
          </set>          
                    
                    
                    
                    
                    
                    
                    
       </class>
    </hibernate-mapping>
      

  4.   

    上面是个例子,大概就是那样做 
    如果还看不懂,建议你看下 尚学堂的hibernate视频教程
    讲的很清楚
    具体连接地址 去百度上搜索吧
      

  5.   

    Session session = null;
    try {
    session = HibernateUtils.getSession();
    session.beginTransaction();

    Classes classes = (Classes)session.load(Classes.class, 1);
    System.out.println("classes.name=" + classes.getName());
    Set students = classes.getStudents();
    for (Iterator iter=students.iterator(); iter.hasNext();) {
    Student student = (Student)iter.next();
    System.out.println("student.name=" + student.getName());
    }
    session.getTransaction().commit();
    }catch(Exception e) {
    e.printStackTrace();
    session.getTransaction().rollback();
    }finally {
    HibernateUtils.closeSession(session);
    }
      

  6.   

    from Course c where c.students.studentId=""好像是会自动导航到你要的东西,
    里面会产生一些连接语句。有段时间做的,现在忘了
      

  7.   


    class Student{
       private Set<StudentSubjectRelation> subjects = new HashSet<StudentSubjectRelation>();
    }
    class Subject{
       private Set<StudentSubjectRelation> students = new HashSet<StudentSubjectRelation>();
    }
    class StudentSubjectRelation{
      private Suject suject;
      private Student student;
    }
    实体类如上,配置文件分别配置Student-StudentSubjectRelation、Subject -StudentSubjectRelation一对多,反向多对一关联通过学生ID获取课程HQL:select s from Student s where s.id = :id and exists (select 1 from StudentSubjectRelation st where st.student.id = s.id);这样查询出来,就可以通过Student 下的getSubjects().get(0).subject 获取到课程信息
      

  8.   

    首先通过学生ID查找出学生表中该条学生信息
    findStuById
    Student stu=stuService.findStuById(Id);
    List lessonstuList = new ArrayList();
    Set lessonstuSet=stu.getLessonstus;
    for (Object object : lessonstuSet) {
      Lessonstu lessonstu= (Lessonstu ) object;
      lessonstuList.add(lessonstu);
    }
    request.setAttribute("lessonstuList ", lessonstuList);
    jsp上logic:iterate不就显示出来了啊 通过多点出一的那方
      

  9.   

    先get/load  Student By id 返回一个student再调用student的getCourseInfo得到一个Set<CourseInfo>再迭代对每个oneCourseInfo,通过getCourse得到一个Course类对象course再取course的id,有了id,再get/load Course By id,Course 不就出来啦
      

  10.   


    双向关联 
    生成第三张表【选课信息】表 
    具体代码如下 实体类: 1.course 
    Java codepackage com.ywjava.course;import java.util.HashSet;
    import java.util.Set;public class Course {
        private Long oid;    private String cid;    private String name;    // 关联属性
        private Set<Student> stus = new HashSet<Student>();    public Course() {
            super();
        }    public Course(String cid, String name) {
            super();
            this.cid = cid;
            this.name = name;
        }    public String getCid() {
            return cid;
        }    public void setCid(String cid) {
            this.cid = cid;
        }    public String getName() {
            return name;
        }    public void setName(String name) {
            this.name = name;
        }    public Long getOid() {
            return oid;
        }    public void setOid(Long oid) {
            this.oid = oid;
        }    public Set<Student> getStus() {
            return stus;
        }    public void setStus(Set<Student> stus) {
            this.stus = stus;
        }    @Override
        public int hashCode() {
            final int PRIME = 31;
            int result = 1;
            result = PRIME * result + ((cid == null) ? 0 : cid.hashCode());
            return result;
        }    @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            final Course other = (Course) obj;
            if (cid == null) {
                if (other.cid != null)
                    return false;
            } else if (!cid.equals(other.cid))
                return false;
            return true;
        }}
    2.student Java codepackage com.ywjava.student;import java.util.HashSet;
    import java.util.Set;public class Student {
        private Long oid;    private String sid;    private String name;    // 关联属性
        private Set<Course> cours = new HashSet<Course>();    public Student() {
            super();
        }    public Student(String sid, String name) {
            super();
            this.sid = sid;
            this.name = name;
        }    public Set<Course> getCours() {
            return cours;
        }    public void setCours(Set<Course> cours) {
            this.cours = cours;
        }    public String getName() {
            return name;
        }    public void setName(String name) {
            this.name = name;
        }    public Long getOid() {
            return oid;
        }    public void setOid(Long oid) {
            this.oid = oid;
        }    public String getSid() {
            return sid;
        }    public void setSid(String sid) {
            this.sid = sid;
        }    @Override
        public int hashCode() {
            final int PRIME = 31;
            int result = 1;
            result = PRIME * result + ((sid == null) ? 0 : sid.hashCode());
            return result;
        }    @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            final Student other = (Student) obj;
            if (sid == null) {
                if (other.sid != null)
                    return false;
            } else if (!sid.equals(other.sid))
                return false;
            return true;
        }}
    配置文件: course.hbn.xml 
    XML code<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.ywjava.course">
       <class name="Course" table="t_course_many2many">
          <id name="oid" column="OID">
             <generator class="hilo">
                <param name="table">t_hilo_many2many</param>
                <param name="column">HIGH</param>
             </generator>
          </id>
          <property name="cid"
                    column="COURSE_ID"
                    unique="true"
                    not-null="true" />
          <property name="name"
                    column="NAME" 
                    not-null="true"/>
                    
          <set name="stus" 
               table="t_enrollment_m2m"
               inverse="true">
             <key column="CFK" />
             <many-to-many class="Student" 
                           column="SFK"/>
          </set> 
                    
                    
                    
                    
                    
                    
                    
       </class>
    </hibernate-mapping>
    student.hnb.xml XML code<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.ywjava.student">
       <class name="Student" table="t_student_many2many">
          <id name="oid" column="OID">
             <generator class="hilo">
                <param name="table">t_hilo_many2many</param>
                <param name="column">HIGH</param>
             </generator>
          </id>
          <property name="sid"
                    column="STUDENT_ID"
                    unique="true"
                    not-null="true" />
          <property name="name"
                    column="NAME" 
                    not-null="true"/>
                    
          <set name="cours" 
               table="t_enrollment_m2m"
               >
             <key column="SFK" />
             <many-to-many class="Course" 
                           column="CFK"/>
          </set>          
                    
                    
                    
                    
                    
                    
                    
       </class>
    </hibernate-mapping>
      

  11.   


    楼主用的两个一对多,这个设计比多对多要好。比如有三个实体类:Student(一), StudentCourse(多), Course(一)。楼主会映射,那映射就不多说了。这种情况下,通过学生ID找到它所有的课程名称大概有两种方法,下面的例子假设已知学生ID=1:1. 通过Java            Student student1 = (Student) session.get(Student.class, 1l);
                
                List<Course> courses = new ArrayList<Course>();
                
                for(StudentCourse studentCourse : student1.getStudentCourses()){
                 courses.add(studentCourse.getCourse());
                }
                
                for(Course course : courses){
                 System.out.println(course.getName());
                }
    2. 通过hql:            String hql = "select c from Course c join c.studentCourses sc where
    sc.student.id = :studentId";
                
                List<Course> courses = session.createQuery(hql).setParameter("studentId", 1l).list();
                
                for(Course course : courses){
                 System.out.println(course.getName());
                }
      

  12.   

    看看Hibernate的帮助文档,哪里有示例
      

  13.   

    添加一个中间表.记录学生ID和课程ID的对应关系.
      

  14.   

    http://www.javaeye.com/topic/125692
    讲的很明白!!
      

  15.   

    昨天做消息模块的时候就也碰到这个问题了,
    因为【学生】和【选课信息】是一对多的关系 
    那么你就弄一个双向的关系关系,在学生实体中加入一个 选课信息的属性 private List<选课信息实体类> selectCourses。
    那么当你 HQL= “select s from Student s where s.id = ?”;的时候就可以查出这个学生对应
    选课信息,而选课信息实体中有一个 private Course course的属性,
    当你在页面上遍历 selectCourses这个集合中就自然可以拿到 所有的课程了其实你看hibernate发出的SQL语句就清楚他就是用了一个多表连接查询,只不过是用hibernate我们写HQL变得soeasy了
      

  16.   

    哪有这么复杂啊,映射关系做好后,就可以学生对象得到学生所在的课程了(Set)
      

  17.   

    public class Student_Class {
        private Student student;
        private TrainClass trainClass;
         get set .....
    }public class Student{
      private Set<Student_Class> mapSet;
      get set....
    }public class TrainClass{
       private Set<Student_Class> mapSet;
       get set ...
    } Student student = new Student();
     student.getMapSet();//这里面不就是所有的中间表的对象吗?每一个对象entiy.getTrainClass()不就得到了一个课程吗? 你遍历一遍Set不就能难道全部的课程了吗
     
      

  18.   

    LZ你分可真多,不过myeclipse自动生成的那个many-to-many的配置文件是不对的。
      

  19.   

    为了200分,我贴下我的角色和权限的表,也是多对多的关系。public class TbRole  implements java.io.Serializable {
        // Fields         private Long id;
         private String rolename="";
         private String depict="";
         private String state="";
         private Set tbPurview = new HashSet(0);   //权限的set
         private Set tbUser = new HashSet(0);
        //get set省略。

    }public class TbPurview  implements java.io.Serializable {
        // Fields         private Long id;
         private String purname="";
         private String pursimple="";
         private String depict="";
         private String state="";
         private Set tbRole = new HashSet(0);   //角色的set}//连接表的bean就用myeclipse自动生成的好了。配置文件。<?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">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.zmax.eps.bean.TbRole" table="TB_ROLE" schema="UZMAX" dynamic-update="true" dynamic-insert="true">
            <id name="id" type="java.lang.Long">
                <column name="ID" precision="22" scale="0" />
                <generator class="increment" />
            </id>
            <property name="rolename" type="java.lang.String">
                <column name="ROLENAME" length="30" />
            </property>
            <property name="depict" type="java.lang.String">
                <column name="DEPICT" length="100" />
            </property>
            <property name="state" type="java.lang.String">
                <column name="STATE" length="10" />
            </property>
    <!--  table参数 连接表的表名,key标签中的name属性 角色在连接表中的字段名  这里要注意-->
            <set name="tbPurview" table="TB_ROLE_PUR_RELATION" lazy="false" inverse="false" cascade="save-update">
                <key>
                    <column name="ROLEID" precision="22" scale="0" not-null="true" />
                </key>
                <many-to-many column="PURID" class="com.zmax.eps.bean.TbPurview" />
            </set>
            <set name="tbUser" inverse="false" lazy="true">
             <key>
             <column name="roleid"></column> 
             </key>
             <one-to-many class="com.zmax.eps.bean.TbUser"/>
            </set>
        </class>
    </hibernate-mapping>权限表<?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">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.zmax.eps.bean.TbPurview" table="TB_PURVIEW" schema="UZMAX" dynamic-update="true" dynamic-insert="true">
            <id name="id" type="java.lang.Long">
                <column name="ID" precision="22" scale="0" />
                <generator class="increment" />
            </id>
            <property name="purname" type="java.lang.String">
                <column name="PURNAME" length="30" />
            </property>
            <property name="pursimple" type="java.lang.String">
                <column name="PURSIMPLE" length="25" />
            </property>
            <property name="depict" type="java.lang.String">
                <column name="DEPICT" length="100" />
            </property>
            <property name="state" type="java.lang.String">
                <column name="STATE" length="10" />
            </property>
            <set name="tbRole" table="TB_ROLE_PUR_RELATION" inverse="false">
                <key>
                    <column name="PURID" precision="22" scale="0" not-null="true" />
                </key>
                <many-to-many column = "ROLEID" class="com.zmax.eps.bean.TbRole" />
            </set>
        </class>
    </hibernate-mapping>连接表的配置文件直接用myeclipse自动生成的好了。如果你的lazy=false  你要获取学生的课程信息的话,你直接获取学生,里面课程set里面就是课程了。