原文网址:http://blog.csdn.net/lian47810925/article/details/5379821
在hibernate映射中,多对多映射是最麻烦,最复杂的映射,通常情况下我们都将其转化为多对一映射来提高效率。本文以老师与课程的对应关系(一个老师可以交多门课程,一门课程可以由多个老师任教)为案例讨论转化的实现:重点考虑其映射文件的配置。
显然以上关系,通过一个中间表(teacher_course),我们可以将其简化成两个多对一得关系:
teacher_course 与teacher 多对一;
teacher_course 与course 多对一;
建立Teacher.java 文件
package cn.csu.domain;
/**
* @file Teacher.java
* @version 1.0
* @since Mar 14, 2010
*/
public class Teacher {
private int id;
private String teacherName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
}
Teacher.hbm.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="cn.csu.domain">
<class name="Teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="teacherName" column="teacher_name"/>
</class>
</hibernate-mapping>
建立Course.java文件
package cn.csu.domain;
/**
* @file Course.java
* @version 1.0
* @since Mar 14, 2010
*/
public class Course {
private int id;
private String courseName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
}
相应Course.hbm.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="cn.csu.domain">
<class name="Course">
<id name="id">
<generator class="native"/>
</id>
<property name="courseName" column="course_name"/>
</class>
</hibernate-mapping>
接下来建立一个中间类,取代多对多映射
建立TeacherCourse.java 文件
package cn.csu.domain;
/**中间类
* @file TeacherCourse.java
* @version 1.0
* @since Mar 14, 2010
*/
public class TeacherCourse {
private int id;
private Teacher teacher;
private Course course;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
}
相应TeacherCourse.hbm.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="cn.csu.domain">
<class name="TeacherCourse" table="teacher_course">
<id name="id">
<generator class="native"/>
</id>
<many-to-one name="teacher" column="teacher_id" class="Teacher"/>
<many-to-one name="course" column="course_id" class="Course"/>
</class>
</hibernate-mapping>
至此,三者之间的映射关系就建立完成。
可用如下测试类,测试:
建立Many2Many.java文件
package cn.csu.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import cn.csu.domain.Course;
import cn.csu.domain.Teacher;
import cn.csu.domain.TeacherCourse;
import cn.csu.util.HibernateUtil;
/**多对多关系转化成三个表进行关系映射
* @file Many2Many.java
* @version 1.0
* @since Mar 14, 2010
*/
public class Many2Many {
public static void main(String[] args) {
create();
get();
}
//多对多关系的插入
static void create(){
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
Teacher t1=new Teacher();
t1.setTeacherName("t1");
Teacher t2=new Teacher();
t2.setTeacherName("t2");
Course c1=new Course();
c1.setCourseName("c1");
Course c2=new Course();
c2.setCourseName("c2");
TeacherCourse tc1=new TeacherCourse();
tc1.setTeacher(t1);
tc1.setCourse(c1);
TeacherCourse tc2=new TeacherCourse();
tc2.setTeacher(t1);
tc2.setCourse(c2);
TeacherCourse tc3=new TeacherCourse();
tc3.setTeacher(t2);
tc3.setCourse(c1);
TeacherCourse tc4=new TeacherCourse();
tc4.setTeacher(t2);
tc4.setCourse(c2);
s.save(t1);
s.save(t2);
s.save(c1);
s.save(c2);
s.save(tc1);
s.save(tc2);
s.save(tc3);
tx.commit();
System.out.println("operate succeed!!!");
}catch(Exception e){
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
if(s!=null){
s.close();
}
}
}
//多对多关系的查询,
static void get(){
Session s=null;
try{
s=HibernateUtil.getSession();
//先查出对应姓名的老师的id号
String hql1="from Teacher where teacherName=:teacherName";
Query query1=s.createQuery(hql1);
query1.setString("teacherName", "t1");
List<Teacher> list1=query1.list();
Teacher teacher=list1.get(0);
System.out.println("Teacher id:"+teacher.getId());
//以该id号查出中间表中相应课程号,从而获得课程名
String hql2="from TeacherCourse where teacher=:teacher";
Query query2=s.createQuery(hql2);
query2.setEntity("teacher", teacher);
List<TeacherCourse> list2=query2.list();
for(TeacherCourse m:list2){
System.out.println("courseName="+
m.getCourse().getCourseName());
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(s!=null){
s.close();
}
}
}
}