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

转载 2012年03月27日 09:29:42

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


 


 

相关文章推荐

Hibernate框架基础——多对多关联关系映射

多对多关联关系映射多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的...

Hibernate框架-------多对多映射(五)

如果要实现多对多关系,必须有一张中间表来用于维护用户User和产品Product之间的关系,这张表里放的是两张表各自的主键值,通过主键与主键的关系来体现两张表的关系。其实多对

【HIbernate框架学习】:Hibernate对象关系映射之双向多对多关联映射

双向多对多关联映射        我们假设这样一个场景,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是 多对多的关系,不管从哪一个角度看,都是多对多的联系。多...

【HIbernate框架学习】:Hibernate对象关系映射之单向多对一关联映射

单向多对一关联映射        我们先来假设一个场景,从学生的角度看,学生和班级的关系就是多对一的关系,也就是多个学生属于一个班 级。多对一关联映射原理就是在多的一端加入一个外键,指向一的一端;...

hibernate多对多关联映射

  • 2013-07-30 23:53
  • 790KB
  • 下载

SSH框架之Hibernate的关联映射之一对多、多对一映射

关联映射之一对多、多对一映射 一、需求: 部门与员工 一个部门有多个员工 【一对多】 多个员工,属于一个部门 【多对一】 二、逻辑分析: 三、代码实现 1、javabean及映射文件的配...

【hibernate框架】一对多(多对一)双向CRUD-Fetch1

关于把数据从里面拿出来是什么样子。 User.java: package cn.edu.hpu.one2many; import javax.persistence.CascadeType; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)