多对多:
  * 关系在第三张表中,和两张表本身没有关系
  * 多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面
  来体现
  * 关系体现:
  第三张表的维护:增加、删除
  course类对应的映射文件
  <?xml version="1.0" encoding="utf-8"?>
  <!--
  Mapping file autogenerated by MyEclipse Persistence Tools
  -->
  <HIBERNATE-MAPPING>
  <CLASS name="manytomany.Course">
  <ID name="cid" length="5" type="java.lang.Long">
  <COLUMN name="cid"></COLUMN>
  <GENERATOR class="increment"></GENERATOR>
  </ID>
  <property name="cname" length="50" type="java.lang.String"></property>
  <property name="description" length="50" type="java.lang.String"></property>
  <!--
  table 指的是多对多的第三张表
  -->
  <SET name="students" inverse="true" cascade="save-update" table="student_course">
  <KEY>
  <COLUMN name="cid"></COLUMN>
  </KEY>
  <MANY-TO-MANY class=.manytomany.Student column="sid"></MANY-TO-MANY>
  </SET>
  </CLASS>
  </HIBERNATE-MAPPING>
  student表对应的映射文件
  <?xml version="1.0" encoding="utf-8"?>
  <!--
  Mapping file autogenerated by MyEclipse Persistence Tools
  -->
  <HIBERNATE-MAPPING>
  <CLASS name="manytomany.Student">
  <ID name="sid" length="5" type="java.lang.Long">
  <COLUMN name="sid"></COLUMN>
  <GENERATOR class="increment"></GENERATOR>
  </ID>
  <property name="sname" length="50" type="java.lang.String"></property>
  <property name="description" length="50" type="java.lang.String"></property>
  <!--
  table 指的是多对多的第三张表
  -->
  <SET name="course" cascade="save-update" table="student_course">
  <KEY>
  <COLUMN name="sid"></COLUMN>
  </KEY>
  <MANY-TO-MANY class="manytomany".Course column="cid"></MANY-TO-MANY>
  </SET>
  </CLASS>
  </HIBERNATE-MAPPING>
  多对多情况示例
  import java.lang.annotation.Target;
  import java.util.HashSet;
  import java.util.Set;
  import org.hibernate.Session;
  import org.hibernate.SessionFactory;
  import org.hibernate.Transaction;
  import org.hibernate.cfg.Configuration;
  import org.junit.Test;
  /**
  * 1、保存课程
  * 2、保存学生
  * 3、保存课程的时候同时保存学生
  * 4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系
  * 5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
  * 6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
  * 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
  * 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系 www.yzyxedu.com
  * 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
  * 10、解除该班级和所有的学生之间的关系
  * 11、删除班级
  * *
  * * 解除该班级和所有的学生之间的关系
  * * 删除该班级
  * *
  * 删除班级的同时删除学生
  * 12、删除学生
  * 同删除班级
  * @author Administrator
  *
  */
  public class ManyToManyTest {
  private static SessionFactory sessionFactory = null;
  static{
  Configuration configuration = new Configuration();
  configuration.configure("cn/itcast/hibernate0909/manytomany/hibernate.cfg.xml");
  sessionFactory = configuration.buildSessionFactory();
  }
  /**
  * 保存课程
  */
  @Test
  public void testSaveCourse(){
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  Course course = new Course();
  course.setCname("生理卫生");
  course.setDescription("讲得都是讲卫生的");
  session.save(course);
  transaction.commit();
  session.close();
  }
  /**
  * 保存学生
  */
  @Test
  public void testSaveStudent(){
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  Student student = new Student();
  student.setSname("里活命");
  student.setDescription("UFO");
  session.save(student);
  transaction.commit();
  session.close();
  }
  /**
  * 保存课程同时保存学生
  * Hibernate: select max(cid) from Course
  Hibernate: select max(sid) from Student
  Hibernate: insert into Course (cname, description, cid) values (?, ?, ?)
  Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
  往Course表和Student表中分别插入了一行数据,和关系表没有关系
  通过映射文件可以看出,Student维护关系,但是从代码中找不到维护关系的代码
  */
  @Test
  public void testSaveCourse_Cascade(){
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  /*
  * 新建一个课程
  */
  Course course = new Course();
  course.setCname("java基础");
  course.setDescription("讲课");
  /**
  * 新建一个学生
  */
  Student student = new Student();
  student.setSname("得意门生:西门庆");
  student.setDescription("高手");
  Set<STUDENT> students = new HashSet<STUDENT>();
  students.add(student);
  /**
  * 通过课程建立课程与学生之间的关系
  */
  course.setStudents(students);//因为课程是一个新的,所以根据没有学生
  session.save(course);
  transaction.commit();
  session.close();
  }
  /**
  * 保存课程同时保存学生,并且建立关系
  */
  @Test
  public void testSaveCourse_Cascade_R(){
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  /**
  * 新建课程
  */
  Course course = new Course();
  course.setCname("java高级");
  course.setDescription("专讲框架,由金云龙代课");
  Set<COURSE> courses = new HashSet<COURSE>();
  courses.add(course);
  /**
  * 新建学生
  */
  Student student = new Student();
  student.setSname("班长");
  student.setDescription("高手,元方,你怎么看?");
  /*
  * 通过学生建立学生和课程之间的关系
  */
  student.setCourse(courses);
  session.save(student);
  transaction.commit();
  session.close();
  }
  /**
  * 已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
  * Hibernate: select course0_.cid as cid0_0_, course0_.cname as cname0_0_, course0_.description as descript3_0_0_ from Course course0_ where course0_.cid=?
  Hibernate: select max(sid) from Student www.yzyedu.com
  Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
  Hibernate: insert into student_course (sid, cid) values (?, ?)
  该sql语句是维护关系
  */
  @Test
  public void testSaveStudent_R(){
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  /**
  * 1、查找一个课程
  * 2、新建一个学生
  * 3、通过学生来维护该学生和课程之间的关系
  */
  //查找课程2
  Course course = (Course)session.get(Course.class, 2L);
  //新建一个学生
  Student student = new Student();
  student.setSname("意门生");
  student.setDescription("aa");
  //通过学生来维护该学生和课程之间的关系
  Set<COURSE> courses = new HashSet<COURSE>();
  courses.add(course);
  student.setCourse(courses);
  session.save(student);
  transaction.commit();
  session.close();
  }
  /**
  * 已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
  */
  @Test
  public void testSaveCourse_R(){
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  /**
  * 1、新建一个课程
  * 2、查找学生托福答案
  * 3、在学生原来的基础上新添加一门课程
  */
  //新建课程
  Course course = new Course();
  course.setCname("项目课");
  course.setDescription("得意门生");
  //查找学生
  Student student = (Student)session.get(Student.class, 5L);
  Set<COURSE> courses = student.getCourse();//获取该学生现在所有的课程
  courses.add(course);
  transaction.commit();
  session.close();
  }
  }

hibernate映射关系之多对多的更多相关文章

  1. Hibernate学习8—Hibernate 映射关系(多对多)

    第二节:Hibernate 多对多映射关系实现   比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系:   1,多对多单向实现: 单向关系: 这 ...

  2. hibernate映射关系(多对多)

    Student与Teacher关系多对多(只建了2个实体类) public class Student { private int id; private String name; private S ...

  3. hibernate中表关系为多对多时,如何只删除中间表数据

    先说问题:我遇到的问题是,在用户和用户组对象关系中他们是多对多关系.所以中间是成在一张中间表的.经理要求当逻辑删除对象数据时,必须删除中间表中的数据. hibernate是面向对象操作sql语句的,如 ...

  4. (八)Hibernate 映射关系

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 一对一映射关系实现 1,按照主键映射: 2, ...

  5. Hibernate学习8—Hibernate 映射关系(一对一)

    第一节:Hibernate 一对一映射关系实现 假设一个用户对应一个地址:   1)按照主键映射: User.java: package com.cy.model; public class User ...

  6. Hibernate映射关系之_多对多

    多对多关系由于效率的原因,实际中会拆成相互的一对多的关系,不再累述

  7. Hibernate 映射关系

    映射组成关系 •建立域模型和关系数据模型有着不同的出发点: –域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 –在没有数据冗余的情况下, 应该尽可能减少表的数目, ...

  8. Hibernate学习2--对象的三种状态以及映射关系的简单配置

    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...

  9. hibernate映射(学生-科目-成绩)

    实体类 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Score> sco ...

随机推荐

  1. 解决Mac OS X Lion狮子系统及win7多分区教程

    [绿茶教程]解决Mac OS X Lion狮子系统及win7多分区教程   工具/原料 8G的u盘制作lion系统安装盘   步骤/方法  插入U盘---开机---按住左下角“Option”键(alt ...

  2. mac上的键盘生活——输入法键位设置小技巧以及去掉自带输入法

    今天上QQ跟阳小进讨论的时候突然聊到了输入法,然后阳小进就发了这样一段文字过来: 修改中西文切换键由Shift到Ctrl 关于为什么要改为Ctrl键,贴吧里有个讨论 在贴吧说服佛振的网友: 「因为 S ...

  3. CSS 概览(CSS2.1)更新时间2014-0406

    CSS和HTML结合 <link rel="stylesheet" type="text/css" href="sheet1.css" ...

  4. poj 1383 Labyrinth【迷宫bfs+树的直径】

    Labyrinth Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 4004   Accepted: 1504 Descrip ...

  5. Maven学习总结(1-10)

    Maven学习总结(1-10) 本文转自 孤傲苍狼 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/xdp-gacl/tag/Maven%E5%AD%A6% ...

  6. Redis学习记录之Java中的初步使用

    1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http:// ...

  7. Epoll之ET、LT模式

    Epoll之ET.LT模式 在使用epoll时,在函数 epoll_ctl中如果不设定,epoll_event 的event默认为LT(水平触发)模式. 使用LT模式意味着只要fd处于可读或者可写状态 ...

  8. Python:urllib和urllib2的区别(转)

    原文链接:http://www.cnblogs.com/yuxc/ 作为一个Python菜鸟,之前一直懵懂于urllib和urllib2,以为2是1的升级版.今天看到老外写的一篇<Python: ...

  9. uvalive 2326 - Moving Tables(区间覆盖问题)

    题目连接:2326 - Moving Tables 题目大意:在一个走廊上有400个教室, 先在有一些桌子要移动, 每次移动需要十分钟, 但是不同房间的桌子可以在同一个十分钟内移动,只要走廊没有被占用 ...

  10. GinWin命令控制台执行指令