<!-- table 指的是多对多的第三张表--><set name="students" table="student_course" cascade="save-update" inverse="true"><key><column name="cid"></column></key><many-to-many class="cn.itcast.hibernate0909.manytomany.Student" column="sid"></many-to-many></set>
<!-- table 指的是多对多的第三张表--><set name="course" table="student_course" cascade="save-update"><key><column name="sid"></column></key><many-to-many class="cn.itcast.hibernate0909.manytomany.Course" column="cid"></many-to-many></set>
/*** 1、保存课程* 2、保存学生* 3、保存课程的时候同时保存学生* 4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系* 5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系* 6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系* 7、已经存在一个学生,已经存在一个课程,解除该学生和原来课程之间的关系,建立该学生和新课程之间的关系* 8、已经存在一个学生,解除该学生和该学生的所有的课程之间的关系* 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();}/*** 保存课程*/@Testpublic 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();}/*** 保存学生*/@Testpublic 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 CourseHibernate: select max(sid) from StudentHibernate: insert into Course (cname, description, cid) values (?, ?, ?)Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)往Course表和Student表中分别插入了一行数据,和关系表没有关系通过映射文件可以看出,Student维护关系,但是从代码中找不到维护关系的代码*/@Testpublic 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();}/*** 保存课程同时保存学生,并且建立关系*/@Testpublic 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 StudentHibernate: insert into Student (sname, description, sid) values (?, ?, ?)Hibernate: insert into student_course (sid, cid) values (?, ?)该sql语句是维护关系*/@Testpublic void testSaveStudent_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();/*** 1、查找一个课程* 2、新建一个学生* 3、通过学生来维护该学生和课程之间的关系*///查找课程2Course course = (Course)session.get(Course.class, 2L);//新建一个学生Student student = new Student();student.setSname("王健得意门生");student.setDescription("张霞");//通过学生来维护该学生和课程之间的关系Set<Course> courses = new HashSet<Course>();courses.add(course);student.setCourse(courses);session.save(student);transaction.commit();session.close();}/*** 已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系*/@Testpublic 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();}/*** 已经存在一个学生,已经存在一个课程,解除该学生和原来一个课程之间的关系,建立该学生和新的一个课程之间的关系*/@Testpublic void testRealse_Rebuild_R(){/** 分析:*   *  从需求分析上看,这个例子就是关系的操作*   *  要查看谁来维护关系,通过映射文件可以看出,Student来维护关系*   *  步骤*       *  查询sid为5的学生*       *  得到该学生的所有的课程*       *  遍历课程*          有可能有两种操作:*             *  先移除集合中的一个元素,再添加*             *  直接修改集合中的元素*  多对多的关系的维护包括两个操作*     第三张表的增加、删除*/Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();//得到sid为5的学生Student student = (Student)session.get(Student.class, 5L);//得到cid为1的课程Course course2 = (Course)session.get(Course.class, 1L);//得到该学生的所有的课程Set<Course> courses = student.getCourse();for(Course course:courses){if(course.getCid().longValue()==2){courses.remove(course);//先移除break;}}
//      List<Course> courseList = new ArrayList<Course>(courses);
//      for(int i=0;i<courseList.size();i++){
//          if(courseList.get(i).getCid().longValue()==2){
//              courseList.set(i, course2);
//          }
//      }
//      Set<Course> courses2 = new HashSet<Course>(courseList);
//      student.setCourse(courses2);courses.add(course2);//增加transaction.commit();session.close();}/*** 已经存在一个学生,已经存在多个课程,解除该学生和原来多个课程之间的关系,建立该学生和新的多个课程之间的关系*/@Testpublic void testRealse_Rebuild_R_Many(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Student student = (Student)session.get(Student.class, 5L);Course course2 = (Course)session.get(Course.class, 2L);Course course5 = (Course)session.get(Course.class, 5L);Set<Course> courses = student.getCourse();for(Course course:courses){//在关系表中把sid为5,cid为1  sid为5,cid为3的两行删除if(course.getCid().longValue()==1||course.getCid().longValue()==3){courses.remove(course);break;}}courses.add(course5);courses.add(course2);transaction.commit();session.close();}/** 已经存在一个学生,解除该学生和该学生的所有的课程之间的关系*/@Testpublic void testRealse_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Student student = (Student)session.get(Student.class, 5L);student.setCourse(null);//解除该学生和所有的课程之间的关系transaction.commit();session.close();}/*** 解除该课程和所有的学生之间的关系,再重新建立该课程和一些新的学员之间的关系*   说明:*     *  必须由学生来维护关系*     *  已经条件是课程*         cid-->course-->set<student>-->遍历每一个student*         -->从每一个student中得到所有的课程-->找到要移除的课程-->移除*/@Testpublic void testRealse_R_C(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Course course = (Course)session.get(Course.class, 3L);Set<Student> students = course.getStudents();for(Student student:students){Set<Course> courses = student.getCourse();for(Course course2:courses){if(course2.getCid().longValue()==3){courses.remove(course2);break;}}}Student student4 = (Student)session.get(Student.class, 4L);Student student5 = (Student)session.get(Student.class, 5L);student4.getCourse().add(course);student5.getCourse().add(course);transaction.commit();session.close();}/*** 解除该课程和所有的学生之间的关系*/
}

【Hibernate】manyTomany练习相关推荐

  1. Hibernate many-to-many

    欢迎关注我的Github Pages: http://chendu.github.io/ Hibernate多对多(many-to-many):在操作和性能方面都不太理想,所以多对多的关系使用的比较少 ...

  2. hibernate教程_Hibernate多对多教程

    hibernate教程 介绍: 在本教程中,我们将学习使用Hibernate @ManyToMany注释定义和使用多对多实体关联. 上下文构建: 为了继续学习本教程,我们假设我们有两个实体– 雇员和资 ...

  3. Hibernate多对多映射 - 连接表

    Hibernate多对多映射 - 连接表 今天我们将使用XML和注释配置来研究Hibernate多对多映射.之前我们看过如何在Hibernate中实现One To One和One To Many映射. ...

  4. hibernate教程_Hibernate教程

    hibernate教程 Recently I have written a lot of hibernate tutorial. Hibernate is one of the best Java O ...

  5. hibernate 映射表_Hibernate多对多映射-连接表

    hibernate 映射表 Today we will look into Hibernate Many to Many Mapping using XML and annotation config ...

  6. Java自动生成增量补丁自动部署_java-Hibernate正在为表生成自动增量交替ID

    我的环境:WAMP中的Hibernate 5,Java 8,Phpmyadmin 问题:Hibernate在表中创建自动增量ID,但是下一个序列被赋予另一个表. 预期 Table 1 Table 2 ...

  7. mysql查询结果输出文件_如何将MySQL查询输出保存到文件?

    mysql查询结果输出文件 We can use the MySQL outfile statement to save the query output into a file. This is v ...

  8. hibernate 多对多(many-to-many)

    多对多(many-to-many):在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型:hibernate会为我们创建中间关联表,转换成两个一对多. 1. E- ...

  9. 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable...

    近期我也是有点郁闷,究竟是程序中处理关联关系.还是直接使用外键处理关联关系呢?这个的说法不一致!程序中处理这样的关联关系的话.自己去维护这样的约束.这样的非常乐观的一种做法!或者是直接在数据库中处理这 ...

  10. Hibernate的关系映射——Many-To-Many(多对多)

    多对多:多对多的关系至少需要三张表,两张关系表,一张中间表,用来保存两个表之间的关系. 用一个例子来表明多对多的关系:用户.角色以及用户角色. 实际应用中:一个用户可能会有多个角色,而一个角色也会有多 ...

最新文章

  1. zoj 3554 A Miser Boss
  2. 以后要把flex用起来
  3. nginx有10个以上参数rewrite的处理
  4. Eureka实例自动过期
  5. 软件_crontab任务配置失败原因总结和技巧
  6. node + express + sockio 在线聊天室
  7. 自己创建一个本地服务器,实现文件下载
  8. linux 随机函数,Linux系统产生随机数方法
  9. 增删改查oracle sql,oracle sql增删改查
  10. lzg_ad:在CF卡上实现EWF功能
  11. 2020届秋招中兴笔试题
  12. 拉格朗日法线性规划求解
  13. ligerUi框架简单的表格展示
  14. unity 中Line Renderser初始化有额外线段
  15. 微信小程序 上滑加载和下拉刷新
  16. 修改微信电脑版的字体
  17. vivado深色背景dracula
  18. Doom/Quake射击游戏引擎
  19. 【自考试题】2019年10月操作系统(02326)真题及答案
  20. 江南大学计算机科学与技术全国排名,2018年江南大学世界排名、中国排名、专业排名...

热门文章

  1. jQuery 制作交通信号灯红绿灯动画效果
  2. Timus 1644. A Whole Lot of Walnuts 算法
  3. EFK(Elasticsearch+Filebeat+Kibana)日志收集系统
  4. 机场售票及管理系统Java+MySQL实现
  5. 自动发货发卡系统搭建教程
  6. 逆变电源电路保护的常见类型及如何选择逆变电源?
  7. 计算机联用测定无机盐溶解热测试题,实验一 计算机联用测定无机盐溶解热.doc...
  8. 2021年度鼓励发展商业品牌首店项目申报条件及奖励,补贴500万
  9. 写一个函数,实现n的阶乘。
  10. SpringBoot 实现热部署