【Hibernate】manyTomany练习
<!-- 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练习相关推荐
- Hibernate many-to-many
欢迎关注我的Github Pages: http://chendu.github.io/ Hibernate多对多(many-to-many):在操作和性能方面都不太理想,所以多对多的关系使用的比较少 ...
- hibernate教程_Hibernate多对多教程
hibernate教程 介绍: 在本教程中,我们将学习使用Hibernate @ManyToMany注释定义和使用多对多实体关联. 上下文构建: 为了继续学习本教程,我们假设我们有两个实体– 雇员和资 ...
- Hibernate多对多映射 - 连接表
Hibernate多对多映射 - 连接表 今天我们将使用XML和注释配置来研究Hibernate多对多映射.之前我们看过如何在Hibernate中实现One To One和One To Many映射. ...
- hibernate教程_Hibernate教程
hibernate教程 Recently I have written a lot of hibernate tutorial. Hibernate is one of the best Java O ...
- hibernate 映射表_Hibernate多对多映射-连接表
hibernate 映射表 Today we will look into Hibernate Many to Many Mapping using XML and annotation config ...
- Java自动生成增量补丁自动部署_java-Hibernate正在为表生成自动增量交替ID
我的环境:WAMP中的Hibernate 5,Java 8,Phpmyadmin 问题:Hibernate在表中创建自动增量ID,但是下一个序列被赋予另一个表. 预期 Table 1 Table 2 ...
- mysql查询结果输出文件_如何将MySQL查询输出保存到文件?
mysql查询结果输出文件 We can use the MySQL outfile statement to save the query output into a file. This is v ...
- hibernate 多对多(many-to-many)
多对多(many-to-many):在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型:hibernate会为我们创建中间关联表,转换成两个一对多. 1. E- ...
- 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable...
近期我也是有点郁闷,究竟是程序中处理关联关系.还是直接使用外键处理关联关系呢?这个的说法不一致!程序中处理这样的关联关系的话.自己去维护这样的约束.这样的非常乐观的一种做法!或者是直接在数据库中处理这 ...
- Hibernate的关系映射——Many-To-Many(多对多)
多对多:多对多的关系至少需要三张表,两张关系表,一张中间表,用来保存两个表之间的关系. 用一个例子来表明多对多的关系:用户.角色以及用户角色. 实际应用中:一个用户可能会有多个角色,而一个角色也会有多 ...
最新文章
- zoj 3554 A Miser Boss
- 以后要把flex用起来
- nginx有10个以上参数rewrite的处理
- Eureka实例自动过期
- 软件_crontab任务配置失败原因总结和技巧
- node + express + sockio 在线聊天室
- 自己创建一个本地服务器,实现文件下载
- linux 随机函数,Linux系统产生随机数方法
- 增删改查oracle sql,oracle sql增删改查
- lzg_ad:在CF卡上实现EWF功能
- 2020届秋招中兴笔试题
- 拉格朗日法线性规划求解
- ligerUi框架简单的表格展示
- unity 中Line Renderser初始化有额外线段
- 微信小程序 上滑加载和下拉刷新
- 修改微信电脑版的字体
- vivado深色背景dracula
- Doom/Quake射击游戏引擎
- 【自考试题】2019年10月操作系统(02326)真题及答案
- 江南大学计算机科学与技术全国排名,2018年江南大学世界排名、中国排名、专业排名...
热门文章
- jQuery 制作交通信号灯红绿灯动画效果
- Timus 1644. A Whole Lot of Walnuts 算法
- EFK(Elasticsearch+Filebeat+Kibana)日志收集系统
- 机场售票及管理系统Java+MySQL实现
- 自动发货发卡系统搭建教程
- 逆变电源电路保护的常见类型及如何选择逆变电源?
- 计算机联用测定无机盐溶解热测试题,实验一 计算机联用测定无机盐溶解热.doc...
- 2021年度鼓励发展商业品牌首店项目申报条件及奖励,补贴500万
- 写一个函数,实现n的阶乘。
- SpringBoot 实现热部署