欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate的inverse和cascade属性

程序员文章站 2022-04-15 23:08:28
...
1、inverse:<set>节点的inverse属性指定关联关系的控制方向默认值为true,默认由one放来维护,
关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系,在<set>中设置inverse="false",
关联关系就由多方维护了,但是在一对多关联中,只能设置one放的inverse为true,这将有助于性能的改善,
只有在多对多情况下才会在<set>中设置哪一方为false。
**所有在Grade.hbm.xml(一方)的set标签设置inverse="true"**,关联关系由对方(多方)维护:
   <set name="students" table="student" inverse="true">
            <!--指定关联的外键-->
            <key column="gid"></key>
            <one-to-many class="com.lxj.entity.Student"></one-to-many>
  </set>


2、cascade(级联操作):当设置了cascade属性部位none时,Hibernate会自动持久化所关联的对象
(cascade属性的设置会带来性能上的变动,谨慎设置),即当我保存班级的时候,发现学生不存在同时
保存学生而不需要单独在save一次学生。
    all:对所有操作进行级联操作
    save-update:执行保存和更新操作时候进行级联操作
    delete:执行删除操作进行级联操作
    none:对所有操作不进行级联操作。

    2.1 没配置cascade:
        Grade g  = new Grade("java 1","1班");
        Student student1 = new Student("女神",1);
        Student student2 = new Student("男神",0);

        g.getStudents().add(student1);
        g.getStudents().add(student2);
        student1.setGrade(g);
        student2.setGrade(g);

        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(g);
        **//既然上面两个关联关系都配置了,报错班级就应该将学生自动保存,而不需要单独save学生
        //所以想要支持这个就需要配置cascade属性**
        **session.save(student1);
        session.save(student2);**
        transaction.commit();
        HibernateUtil.closeSession();


    2.2 配置cascade,在班级的<set>中配置:
         //在保存和更新时候级联
          <set name="students" table="student" inverse="true" cascade="save-update">
            <!--指定关联的外键-->
            <key column="gid"></key>
            <one-to-many class="com.lxj.entity.Student"></one-to-many>
        </set>

        //测试代码
        Grade g  = new Grade("java 1","1班");
        Student student1 = new Student("女神",1);
        Student student2 = new Student("男神",0);

        g.getStudents().add(student1);
        g.getStudents().add(student2);
        student1.setGrade(g);
        student2.setGrade(g);

        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(g);
        **//这里就不需要在单独保存学生了**
        transaction.commit();
        HibernateUtil.closeSession();

    2.3 同样的也可以保存学生的时候级联保存班级,就在学生的Student.hbm.xml中配置cascade:
        <many-to-one name="grade" class="com.lxj.entity.Grade" 
        column="gid" cascade="all"></many-to-one>

        //这时候设置学生与班级关联关系后,只需要保存学生也可保存班级了


3、设置了双向关联关系后的查询信息更简单:
        Session session = HibernateUtil.getSession();
        Student student = (Student) session.get(Student.class,1);
        //因为设置了双向关联关系,直接get就可以获取到对应的班级,同样因为设置了双向关联关系,通过年级查学生get可以获取到学生集合
        System.out.println(student.getGrade().getGname());