Hibernate的inverse和cascade属性

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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值