hibernate映射关系之一对多(三)
//建立关系 transaction.commit(); session.close(); } /** * 已经存在一个学生,解除该学生和该学生所在班级之间的关系 * Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.description as descript3_1_0_ from Student student0_ where student0_.sid= Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid= Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid= Hibernate: update Student set cid=null where cid= 解除关系的语句 */ @Test public void testRealse_R(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); /** * 1、查询该学生 * 2、查询该班级 * 3、解除关系 */ Student student = (Student)session.get(Student.class, 1L); Classes classes = (Classes)session.get(Classes.class, 1L); classes.getStudents().remove(student); transaction.commit(); session.close(); } /** * 解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系 */ @Test public void testRealseAll_Rebuild_R(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Classes classes = (Classes)session.get(Classes.class, 5L); List
students = session.createQuery(from Student where sid in(3,4,5)).list(); //重新建立班级和学生之间的关系 classes.setStudents(new HashSet
(students)); transaction.commit(); session.close(); } /** * 解除该班级和所有的学生之间的关系 */ @Test public void testRealseAll_R(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Classes classes = (Classes)session.get(Classes.class,5L); classes.setStudents(null); transaction.commit(); session.close(); } /** * 删除班级 * 1、解除该班级和所有的学生之间的关系 * 如果班级具体维护关系的能力,hibernate内部自动实现 * 2、删除班级 */ @Test public void testDeleteClasses(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Classes classes = (Classes)session.get(Classes.class, 1L); session.delete(classes); transaction.commit(); session.close(); } /** * 删除班级,同时删除学生 * Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid= Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid= Hibernate: update Student set cid=null where cid= 解除班级和学生之间的关系 Hibernate: delete from Student where sid= Hibernate: delete from Classes where cid= */ @Test public void testDeleteClasses_Cascade(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Classes classes = (Classes)session.get(Classes.class, 1L); session.delete(classes); transaction.commit(); session.close(); } /** * 总结: * 1、在整个例子中,班级负责维护关系,只要班级维护关系就会发出update语句 * 2、解除关系就是相对应的外键设置为null * 3、改变关系就是相对应的外键从一个值变成另外一个值 * 4、在代码中的体现: * classes.setStudents(); 重新建立关系 * classes.getStudents().remove; 解除关系 * classes.setStudents(null); 解除所有的关系 * classes.getStudents().add() 在原有的关系的基础上再建立关系 */