一对多的双向

一对多指的是类与集合之间的关系
多对一指的是类与类之间的关系

one-to-many:一对多指的是类与集合之间的关系
映射文件的配置
many-to-one:多对一指的是类与类之间的关系
映射文件的配置

总结

  1、一般情况下,一对多,多的一方维护关系,效率比较高
  2、一对多,如果一的一方维护关系,实际上就是发出更新外键的update语句
  3、如果多的一方维护关系,实际上就是更新了student表的所有的字段
  4、一般情况下,Classes.hbm.xml文件中,针对set集合的invserse的值为true 不维护关系
@Test
public void testSaveStudent_Cascade_SaveClasses(){
    Session session = sessionFactory.getCurrentSession();
    Transaction transaction = session.beginTransaction();
        
        Student student = new Student();
        student.setName("哈哈");
        
        Classes classes = new Classes();
        classes.setName("嘿嘿");
        
        //建立学生与班级之间的关系
        student.setClasses(classes);
        
        session.save(student);
        transaction.commit();
    }
在更新学生的时候,保存班级
    
@Test
public void testUpdateStudent_Cascade_SaveClasses(){
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        Student student = (Student)session.get(Student.class, 3L);
        
        Classes classes = new Classes();
        classes.setName("asdf");
        
        //建立学生与班级之间的关系
        student.setClasses(classes);
    
        transaction.commit();
    }

 已经存在一个班级,已经存在一个学生,让该学生加入到该班级
     
    
    @Test
    public void testBuildR(){
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        Student student = (Student)session.get(Student.class, 3L);
        Classes classes = (Classes)session.get(Classes.class, 5L);
        //建立学生和班级之间的关系
        student.setClasses(classes);
        transaction.commit();
    }

把sid为1的学生从cid为5的班级转到3的班级

    @Test
    public void testTransform(){
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        Classes classes = (Classes)session.get(Classes.class, 3L);
        Student student = (Student)session.get(Student.class, 1L);
        //建立关系
        student.setClasses(classes);
        transaction.commit();
    }
    
 解除一个班级和所有的学生之间的关系

    @Test
    public void testRealseAllR(){
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //提取cid为3的班级
        Classes classes = (Classes)session.get(Classes.class, 3L);
        Set<Student> students = classes.getStudents();

        for (Student student : students) {
            student.setClasses(null);
        }
        transaction.commit();
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,238评论 19 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,825评论 0 4
  • 作为一种轻量级的关系映射工具,Hibernate支持各种关系映射,例如:多对一、一对多和一对一的数据库表关系,通过...
    Ystrator阅读 543评论 0 1
  • 对于一位有着20年教龄的我来说,在盘点自己这一年的教师生涯时,居然写出以“学着做老师”为标题的文字,如果是在...
    玫兰妮阅读 354评论 0 2
  • 不喜欢就是不喜欢,永远都没有喜欢的可能,不会和对方多费口舌,哪怕多讲一句话,多露一个表情,多做一个解释,这些在我看...
    玫的瑰阅读 227评论 0 0