Hibernate框架中如何将多对多映射转化为多对一映射

原文网址: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();
			}
		}
	}
}


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值