学生选课关系:student(studentid,name,courses) course(courseid,name,students) stu_course(studentid,courseid,score) (只列出其中关键字段)
以下是类文件:
public class Course implements java.io.Serializable {
private Integer courseid;
private String name;
private Set<Student> students = new HashSet<Student>();
// setters and getters
}
public class Student implements java.io.Serializable {
private String studentid;
private String name;
private Set<Course>courses = new HashSet<Course>();
// setters and getters
}
不需要为中间表定义类
以下是hibernate映射文件(中间表不需要配置映射文件):
<class name="com.student.javabean.Course" table="course" catalog="course_stu">
<id name="courseid" type="java.lang.Integer">
<column name="courseid" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<!--stu_course为中间表-->
<set name="students" cascade="all" inverse="true" table="stu_course" lazy="true">
<key>
<column name="courseid" not-null="true" />
</key>
<many-to-many class="com.student.javabean.Student" column="studentid" />
</set>
</class>
<class name="com.student.javabean.Student" table="student" catalog="course_stu">
<id name="studentid" type="java.lang.String">
<column name="studentid" length="10" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<set name="courses" lazy="true" table="stu_course"><!--中间表名字要一样-->
<key column="studentid"/>
<many-to-many class="com.student.javabean.Course" column="courseid" />
</set>
</class>
在业务层这样通过以下方式就可以操作
Student s = sdao.findById(studentid);
Set<Course>courses = s.getCourses();
需要关闭延迟加载(配置lazy="false")或强制加载 Hibernate.initialize()或用opensessionviewfilter;
否则会报错:no session or session is closed.