zoukankan      html  css  js  c++  java
  • Hibernate(级联保存、级联删除)

    级联操作:

    属性:cascade

    值:save-update(级联保存)

           delete(级联删除)

           all(级联保存+级联删除)

    优点:虽然,不用级联操作也能解决问题。但是级联操作可以减少代码量,使得操作变得更加简洁。

    一、一对多

    以下演示为操作一的一方(班级),同时实现对班级下的学生的增加删除操作,配置文件的修改是在一的一方(班级):

    1、级联保存:

    (1)不使用级联保存:

    一般情况下向一个不存在的班级中添加学生,在设置了班级与学生的一对多、多对一关系后,需要调用save方法对班级和学生进行保存,如果有很多个学生会比较麻烦。

    一对多配置:

     <set name="students" table="student" ><!--一对多关系配置-->
            <key column="classno" update="false"></key><!--指定了集合表的外键-->
                <one-to-many class="Student"></one-to-many>
            </set>
    public static void testadd1() {
                Session session = HibernateUtils.openSession();//获得session
                Transaction transaction = session.beginTransaction();//开启事务
                Clas clas=new Clas();
                clas.setClassname("计科171");
                clas.setClassno(4600);
                clas.setDepartment("一号楼");
                clas.setMonitor("zhai");
    
                Student student=new Student();
                student.setSname("翟");
                student.setStudentno(2017151411);
                student.setPoint(123f);
                student.setSex("男");
                student.setBirthday("2019-11-11");
                student.setPhone("18739496522");
                student.setClassno("221221");
                student.setEmail("34288334@qq.com");
    
                Student student1=new Student();
                student1.setSname("翟hb");
                student1.setStudentno(2017151419);
                student1.setPoint(666f);
                student1.setSex("女");
                student1.setBirthday("2019-11-11");
                student1.setPhone("18739496522");
                student1.setClassno("221221");
                student1.setEmail("34288334@qq.com");
    
                clas.getStudents().add(student);//一对多,一个班级下有多个学生
                clas.getStudents().add(student1);//获取Set集合对象并向其中添加元素
    
                student.setaClas(clas);//多对一,学生属于哪一个班级
                student1.setaClas(clas);
    
                session.save(clas);
                session.save(student);
                session.save(student1);//需要执行save方法对学生和班级进行保存
    
                transaction.commit();//提交事务
                session.close();//关闭资源
            }
    

    (2)使用级联保存:

    配置文件(需要添加cascade属性):

    <set name="students" cascade="save-update"><!--一对多关系配置-->
            <key column="classno" update="false"></key><!--指定了集合表的外键-->
                <one-to-many  class="Student"></one-to-many>
            </set>
     public static void testadd1() {
                Session session = HibernateUtils.openSession();//获得session
                Transaction transaction = session.beginTransaction();//开启事务
                Clas clas=new Clas();
                clas.setClassname("计科171");
                clas.setClassno(46);
                clas.setDepartment("一号楼");
                clas.setMonitor("zhai");
    
                Student student=new Student();
                student.setSname("翟");
                student.setStudentno(210);
                student.setPoint(123f);
                student.setSex("男");
                student.setBirthday("2019-11-11");
                student.setPhone("18739496522");
                student.setEmail("34288334@qq.com");
    
                Student student1=new Student();
                student1.setSname("翟hb");
                student1.setStudentno(112);
                student1.setPoint(666f);
                student1.setSex("女");
                student1.setBirthday("2019-11-11");
                student1.setPhone("18739496522");
                student1.setEmail("34288334@qq.com");
    
    
                clas.getStudents().add(student);//一对多,一个班级下有多个学生
                clas.getStudents().add(student1);//获取Set集合对象并向其中添加元素
    
                session.save(clas);
                
                transaction.commit();//提交事务
                session.close();//关闭资源
            }
    

     在保存的时候只需要保存一的一方,减少了代码量。 

    2、级联删除:

    (1)普通方法:

    配置文件:

     <set name="students"><!--一对多关系配置-->
            <key column="classno" update="false"></key><!--指定了集合表的外键-->
                <one-to-many  class="Student"></one-to-many>
     </set>
     public static void testDel() {
               Session session = HibernateUtils.openSession();//获得session
               Transaction transaction = session.beginTransaction();//开启事务
               Clas clas=session.get(Clas.class,90865);//获得要删除的学生属于那一个班级
               Student student1=session.get(Student.class,937221539);//获得要删除的学生
               Student student2=session.get(Student.class,937221540);//获得要删除的学生
               clas.getStudents().remove(student1);
               clas.getStudents().remove(student2);
               student1.setaClas(null);
               student2.setaClas(null);
               session.remove(clas);
               transaction.commit();//提交事务
               session.close();//关闭资源
           }  

     对一个班级和班级下的两名学生进行删除操作,需要先对学生进行删除,然后删除学生所在的班级,如果学生数量比较多,那么操作起来是相当麻烦的。

    (2)级联删除:

    先对配置文件添加cascade属性:

     <set name="students" cascade="delete"><!--一对多关系配置-->
            <key column="classno" update="false"></key><!--指定了集合表的外键-->
                <one-to-many  class="Student"></one-to-many>
            </set>
     public static void testDel() {
               Session session = HibernateUtils.openSession();//获得session
               Transaction transaction = session.beginTransaction();//开启事务
               Clas clas=session.get(Clas.class,90867);//获得要删除的学生属于那一个班级
               session.delete(clas);
               transaction.commit();//提交事务
               session.close();//关闭资源
           }

    在进行删除操作的时候,只需要删除一的一方(班级),多的一方(学生),也会被删除。即,在对某一个班级进行删除的时候,班级下的所有学生一起也被删除了,减少了代码量,尤其是在学生数量较多的情况下优点更为明显。

    二、多对一:

    1、级联保存:

    (1)在多的一方(学生)对配置文件增加cascade属性:

    <many-to-one cascade="save-update" name="aClas" column="classno" class="Clas"></many-to-one>

    (2)在增加学生的同时,会把学生所在的班级一同进行添加:

    public static void testadd1() {
                Session session = HibernateUtils.openSession();//获得session
                Transaction transaction = session.beginTransaction();//开启事务
                Clas clas=new Clas();
                clas.setClassname("计科171");
                clas.setClassno(46);
                clas.setDepartment("一号楼");
                clas.setMonitor("zhai");
    
                Student student=new Student();
                student.setSname("翟");
                student.setStudentno(210);
                student.setPoint(123f);
                student.setSex("男");
                student.setBirthday("2019-11-11");
                student.setPhone("18739496522");
                student.setEmail("34288334@qq.com");
    
                clas.getStudents().add(student);//获取Set集合对象并向其中添加元素
                student.setaClas(clas);
    
                session.save(student);
    
                transaction.commit();//提交事务
                session.close();//关闭资源
            }
    

      

  • 相关阅读:
    [RxJS] Filtering operators: throttle and throttleTime
    [RxJS] Transformation operators: debounce and debounceTime
    [AngularJS] Default Child state and nav between child state
    [RxJS] Transformation operator: bufferToggle, bufferWhen
    [RxJS] Transformation operators: delay and delayWhen
    [RxJS] Transformation operator: buffer, bufferCount, bufferTime
    [RxJS] Transformation operator: scan
    [置顶] 利用Global.asax的Application_Error实现错误记录,错误日志
    Java方法重写与方法重载
    Inside GDALAllRegister之一: 五大部分
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11854406.html
Copyright © 2011-2022 走看看