【Hibernate】双向关联的oneTomany练习
来源:互联网 发布:php from unixtime 编辑:程序博客网 时间:2024/06/08 17:07
<!-- cascade指的是对象对对象的操作 inverse指的是对象对关系的操作 --> <set name="students" cascade="all" inverse="false" lazy="extra"> <key> <!-- 通过classes建立与student之间的联系 --> <column name="cid"></column> </key> <one-to-many class="cn.itcast.hibernate0909.onetomany.doubl.Student"/> </set>
/** * 1、保存班级 * 2、保存学生 * 3、保存班级的时候同时保存学生 * 4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系 * 5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系 * 6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系 * 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系 * 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系 * 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系 * 10、解除该班级和所有的学生之间的关系 * 11、删除班级 * * * * 解除该班级和所有的学生之间的关系 * * 删除该班级 * * * 删除班级的同时删除学生 * 12、删除学生 * 同删除班级 * @author Administrator * */public class OneToManyDoubleTest {private static SessionFactory sessionFactory = null;static{Configuration configuration = new Configuration();configuration.configure("cn/itcast/hibernate0909/onetomany/doubl/hibernate.cfg.xml");sessionFactory = configuration.buildSessionFactory();}/** * 保存班级的时候同时保存学生 * Hibernate: select max(cid) from ClassesHibernate: select max(sid) from StudentHibernate: insert into Classes (cname, description, cid) values (?, ?, ?)Hibernate: insert into Student (sname, description, cid, sid) values (?, ?, ?, ?)Hibernate: update Student set cid=? where sid=? 更新外键说明: classes.setStudents(students); 通过classes来维护关系 ,要发出update语句,更新外键 */@Testpublic void testSaveClasses_Cascade_S(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = new Classes();classes.setCname("aaaa");classes.setDescription("asdffd");Student student = new Student();student.setSname("李克强");student.setDescription("tttttt");Set<Student> students = new HashSet<Student>();students.add(student);//通过classes建立classes与students之间的关系classes.setStudents(students);//通过student建立classes与students之间的关系//student.setClasses(classes);session.save(classes);transaction.commit();session.close();}/** * Hibernate: select max(sid) from StudentHibernate: select max(cid) from ClassesHibernate: insert into Classes (cname, description, cid) values (?, ?, ?)Hibernate: insert into Student (sname, description, cid, sid) values (?, ?, ?, ?) student.setClasses(classes);通过student来维护classes 对student的增、删、改本身就是对外键的操作,所以这里不再发出update语句 一对多,多的一方维护关系,效率比较高 */@Testpublic void testSaveStudent_Cascade_C(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = new Classes();classes.setCname("aaaa");classes.setDescription("asdffd");Student student = new Student();student.setSname("李克强");student.setDescription("tttttt");Set<Student> students = new HashSet<Student>();students.add(student);//通过classes建立classes与students之间的关系//classes.setStudents(students);//通过student建立classes与students之间的关系student.setClasses(classes);session.save(student);transaction.commit();session.close();}/** * 已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系 */@Testpublic void testSaveStudent_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = (Classes)session.get(Classes.class, 1L);Student student = new Student();student.setSname("里活命");student.setDescription("ufo");//通过student建立classes与student的关系student.setClasses(classes);session.save(student);transaction.commit();session.close();}/** * 已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系 * 通过分析: * * 因为存在建立关系的操作,所以操作学生端效率比较高 * * 在这里存在保存班级的操作,所以应该是通过更新学生级联保存班级 */@Testpublic void testUpdateStudent_CasCade(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Student student = (Student)session.get(Student.class, 2L);Classes classes = new Classes();classes.setCname("传智播客集团部");classes.setDescription("都是高官");student.setClasses(classes);session.save(classes);transaction.commit();session.close();}/** * 已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系 */@Testpublic void testRebuild_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Student student = (Student)session.get(Student.class, 2L);Classes classes = (Classes)session.get(Classes.class, 1L);student.setClasses(classes);transaction.commit();session.close();}/** * 已经存在一个学生,解除该学生和该学生所在班级之间的关系 */@Testpublic void testRealse_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Student student = (Student)session.get(Student.class, 2L);student.setClasses(null);transaction.commit();session.close();}/** * 解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系 */@Testpublic void testRealse_Rebuild_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();/** * 1、获取班级 * 2、获取该班级的所有的学生 * 3、遍历学生,把学生的班级设置为null * 4、新建两个学员 * 5、建立两个学员与班级之间的关系 */Classes classes = (Classes)session.get(Classes.class, 1L);Set<Student> students = classes.getStudents();for(Student student:students){student.setClasses(null);}Student student = new Student();student.setSname("王二麻子");student.setDescription("爷们");Student student2 = new Student();student2.setSname("王二麻子的哥");student2.setDescription("爷们的哥");//student.setClasses(classes);//student2.setClasses(classes);students.add(student);students.add(student2);/** * 当发生transaction.commit的时候,hibernate内部会检查所有的持久化对象 * 会对持久化对象做一个更新,因为classes是一个持久化状态的对象,所以hibernate * 内部要对classes进行更新,因为在classes.hbm.xml文件中<set name="students" cascade="all" inverse="true"> * 意味着在更新classes的时候,要级联操作student,而student是一个临时状态的对象 * 所以要对student进行保存,在保存student的时候,就把外键更新了 */transaction.commit();session.close();}/** * 解除该班级和所有的学生之间的关系 */@Testpublic void testRealseAll_R(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = (Classes)session.get(Classes.class, 1L);Set<Student> students = classes.getStudents();for(Student student:students){student.setClasses(null);}transaction.commit();session.close();}/** * 先解除关系,再删除班级 */@Testpublic void testDeleteClass_1(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = (Classes)session.get(Classes.class, 1L);Set<Student> students = classes.getStudents();for(Student student:students){student.setClasses(null);}session.delete(classes);transaction.commit();session.close();}/** * 在删除班级的时候,同时删除整个班级的学生 *//** * 删除学生 * 直接删除学生即可 */@Testpublic void teetst(){Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();Classes classes = (Classes)session.get(Classes.class, 1L);Set<Student> students = classes.getStudents();for(Student student:students){student.setClasses(null);break;}transaction.commit();session.close();}}
0 0
- 【Hibernate】双向关联的oneTomany练习
- 【Hibernate】单向关联的oneTomany练习
- JPA OneToMany双向关联
- Hibernate 使用 Annotation 之 OneToMany(双向关联关系)
- Hibernate xml配置方法之OneToMany(双向关联关系)
- 在Hibernate中,@OneToMany单/双向外键关联
- @ManyToOne和@OneToMany双向关联
- 双向一对多关联OneToMany
- Hibernate 中annotations(注解开发)的@OneToMany 一对多双向关联映射后,出现的jar包冲突问题
- hibernate练习之双向关联一对多
- 码农小汪-Hibernate学习9-hibernate双向关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
- Hibernate基础之九:多对多,单/双向关联 @ManyToOne @OneToMany
- Hibernate基础之九:多对多,单/双向关联 @ManyToOne @OneToMany
- Hibernate中的Entity类之间的OneToMany关联
- Hibernate的单向关联和双向关联
- hibernate3.3.2学习笔记---OneToMany双向关联
- Hibernate注释大全 2(2010-01-16 14:28:05)转载标签:it 一对多 @OneToMany 注解可定义一对多关联。一对多关联可以是双向的。 双向 @SqlResul
- Hibernate学习总结:OneToMany/ManyToOne双向
- css盒子模型及实例
- java 导出并下载excel
- 获取MAC地址方法大全
- 西林街网盘搜索 千万亿网盘资源
- 如何使用 Xmanager 登录 Linux
- 【Hibernate】双向关联的oneTomany练习
- Codeforces Round #242 (Div. 2) B. Megacity
- gettimeofday和clock_gettime的不同
- Thymeleaf 首发教程 与 spring 整合
- 鸡为什么要过马路
- ArcMAp对线要素进行平滑处(打断)
- MD5算法原理
- Thymeleaf模板的使用
- 最近几天一点感悟