from Course c where c.students.studentId=""好像是会自动导航到你要的东西, 里面会产生一些连接语句。有段时间做的,现在忘了
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 获取到课程信息
首先通过学生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不就显示出来了啊 通过多点出一的那方
先get/load Student By id 返回一个student再调用student的getCourseInfo得到一个Set<CourseInfo>再迭代对每个oneCourseInfo,通过getCourse得到一个Course类对象course再取course的id,有了id,再get/load Course By id,Course 不就出来啦
双向关联 生成第三张表【选课信息】表 具体代码如下 实体类: 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"/>
昨天做消息模块的时候就也碰到这个问题了, 因为【学生】和【选课信息】是一对多的关系 那么你就弄一个双向的关系关系,在学生实体中加入一个 选课信息的属性 private List<选课信息实体类> selectCourses。 那么当你 HQL= “select s from Student s where s.id = ?”;的时候就可以查出这个学生对应 选课信息,而选课信息实体中有一个 private Course course的属性, 当你在页面上遍历 selectCourses这个集合中就自然可以拿到 所有的课程了其实你看hibernate发出的SQL语句就清楚他就是用了一个多表连接查询,只不过是用hibernate我们写HQL变得soeasy了
哪有这么复杂啊,映射关系做好后,就可以学生对象得到学生所在的课程了(Set)
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不就能难道全部的课程了吗
LZ你分可真多,不过myeclipse自动生成的那个many-to-many的配置文件是不对的。
为了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省略。
生成第三张表【选课信息】表
具体代码如下实体类: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>
如果还看不懂,建议你看下 尚学堂的hibernate视频教程
讲的很清楚
具体连接地址 去百度上搜索吧
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);
}
里面会产生一些连接语句。有段时间做的,现在忘了
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 获取到课程信息
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不就显示出来了啊 通过多点出一的那方
双向关联
生成第三张表【选课信息】表
具体代码如下 实体类: 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>
楼主用的两个一对多,这个设计比多对多要好。比如有三个实体类: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());
}
讲的很明白!!
因为【学生】和【选课信息】是一对多的关系
那么你就弄一个双向的关系关系,在学生实体中加入一个 选课信息的属性 private List<选课信息实体类> selectCourses。
那么当你 HQL= “select s from Student s where s.id = ?”;的时候就可以查出这个学生对应
选课信息,而选课信息实体中有一个 private Course course的属性,
当你在页面上遍历 selectCourses这个集合中就自然可以拿到 所有的课程了其实你看hibernate发出的SQL语句就清楚他就是用了一个多表连接查询,只不过是用hibernate我们写HQL变得soeasy了
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不就能难道全部的课程了吗
// 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里面就是课程了。