Hibernate框架中如何将多对多映射转化为多对一映射
来源:互联网 发布:淘宝收货人姓名搞笑 编辑:程序博客网 时间:2024/06/06 12:44
在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
- Hibernate框架中如何将多对多映射转化为多对一映射
- Hibernate框架中如何将多对多映射转化为多对一映射
- Hibernate框架中如何将多对多映射转化为多对一映射
- Hibernate框架-----多对一映射(三)
- Hibernate关联映射--多对一映射
- hibernate中多对一关系映射
- hibernate中多对一映射查询
- hibernate中多对一映射删除
- hibernate中多对一映射更新
- hibernate多对一映射
- Hibernate 多对一映射
- 【Hibernate】多对一映射
- hibernate多对一映射
- SSH框架之Hibernate的关联映射之一对多、多对一映射
- Hibernate多对多关系映射拆解为两队多对一关系映射
- 【Hibernate框架】关联映射(一对多,多对一)
- Hibernate框架-------多对多映射(五)
- Hibernate框架-多对多映射
- C语言面向对象编程(一):封装与继承
- linux设备驱动开发学习之旅--支持阻塞的设备驱动
- 13周。。项目一插入
- 经典算法之深度优先搜索
- TexturePacker一个神奇的图片资源整合工具
- Hibernate框架中如何将多对多映射转化为多对一映射
- 学习OpenCV:滤镜系列(2)——扩张&挤压
- linux设备驱动开发学习之旅--支持轮询操作的设备驱动
- Android字体大小怎么自适应不同分辨率?
- linux设备驱动开发学习之旅--异步I/O
- attributesOfItemAtPath获取文件的大小、文件的内容等属性
- 工作一年多个人总结
- 小总结
- 执行计划