Hibernate入门(五)hibernate的级联(cascade)表操作

存在的意义

在实际做项目的时候,经常会遇到表与表之间的关联操作,比如一个班级里面有多个学生,一个部门有多个职员,这是一对多的关系,还有例如一个主题有一个作者,这是一对一,等,这时候就必须涉及到表的关联操作

一对多的单项关联

什么意思呢?

比如一个班级里面有多个学生,班级表关联学生表,属于一对多,但是学生表并不关联班级表,这个就属于单项的关联

只能从classes找到student,所以为单项关联

class.hbm.xml中的配置

<set name="students" cascade="all" inverse="false">
            <!--
                用来描述外键
                  column  外键的名称
                     在hibernate低层拼接sql语句的时候,要用到外键
             -->
            <key>
                <column name="cid"></column>
            </key>
            <!--
                classes类与Student类之间的关系
             -->
            <one-to-many class="cn.itcast.sh08.hibernate.domain.Student"/>
        </set>

而在student.hbm.xml中除了id和name属性以外没有有关class的属性设置

通过班级保存学生的级联操作

前提条件:

public void testSaveClasses_Cascade_Save_Student(){
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        Classes classes =  new Classes();
        classes.setName("java基础班");

        /**
         * 创建了一个set集合,往set集合中添加了3个学生
         */
        Set<Student> students =  new HashSet<Student>();
        Student student = new Student();
        student.setName("王三麻子");
        Student student2 = new Student();
        student2.setName("潘金莲");
        Student student3 = new Student();
        student3.setName("林志玲");
        students.add(student);
        students.add(student2);
        students.add(student3);

        //建立班级和学生之间的关联
        classes.setStudents(students);
        session.save(classes);
        transaction.commit();

说明:

当执行session.flush的时候,通过第97行代码使classes变成持久化状态的对象,这个时候hibernate内部会去检查Classes.hbm.xml文件中的set元素,查看set元素上是否标有cascade属性,如果cascade属性的值为”save-update”,所以在保存classes的时候,检查classes对象中的set属性,这个时候set对象中有3个student对象,并且这三个student对象的主键没有值,所以在保存classes的时候同时保存了student。

保存班级的同时更新学生

在保存班级的同时更新学生也是同样的,上面的不变,执行的流程改变的就是在检查student的主键的值的时候发现是有值的,所以执行的是更新操作。

cascade属性(常用的)

上面已经提到了在更新班级或者新增班级的时候这个属性是必要要的,并且是save-update属性值,另外两个delete和all是干什么用的呢

public void testDeleteClasses(){
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        Classes classes = (Classes)session.get(Classes.class,2L);
        session.delete(classes);
        transaction.commit();
    }

上述代码是在cascade=“save-update”的情况下执行的,如果cascade=“delete”或者是delete就会在删除班级的时候删除关联的学生

inverse属性

这个属性的值只有两种,true或者是false,默认的是true表示不维护属性,false表示维护属性,不维护属性的意思就是说在你删除班级的时候,就算cascade的属性值是delete,对应的学生是不会被删除的,因为关系不被维护,又比如说:

在新增学生的时候可以插入新的学生,但是学生没有对应的外键,也就是没有对应的班级,因为inverse不维护关系

级联和维护关系的区别

cascade是对象与对象之间的关系

inverse是对象与外键之间的关系,针对的是外键

总结

1、只能通过班级联系到学生,不能通过学生联系到班级

2、如果涉及到关系操作,只能从班级出发维护关系

3、只要涉及到维护关系就会发出update语句

4、所以一对多,一的一方维护关系效率不高

5、级联操作:save-update all delete

一对多的双向关联

其实跟一对多的单向关联差不多,只要你充分理解了单项关联,就基本理解双向,就像打架的时候,只不过是一种是只能一个人打另一个人,双向的就是两个人可以互相打,增加的部分:

在student.hbm.xml中

总结(效率的深入理解)

1、一对多如果多的一方维护关系,不会发出update语句
2、一般情况下,一对多,多的一方维护关系效率比较高
3、在一般情况下,classes.hbm.xml文件中的set元素中的inverse属性一般设置为true
4、如果上述的配置的inverse设置为false,那么只要更新了关系,只要在代码端建立了classes与student之间的关系,session只要操作classes,就会发出更新外键的sql语句,这样效率比较低

多对多

course.hbm.xml文件:

<class name="cn.itcast.sh08.hibernate.domain.Course">
        <id name="cid">
            <generator class="increment"></generator>
        </id>
        <property name="name" length="20"></property>
        <set name="students" table="student_course">
            <!--
                外键
             -->
            <key>
                <column name="cid"></column>
            </key>
            <many-to-many class="cn.itcast.sh08.hibernate.domain.Student" column="sid"></many-to-many>
        </set>
    </class>

student.hbm.xml文件:

<class name="cn.itcast.sh08.hibernate.domain.Student">
        <id name="sid">
            <generator class="increment"></generator>
        </id>
        <property name="name" length="20"></property>
        <!--
            table属性代表第三张表
         -->
        <set name="courses" table="student_course" cascade="save-update">
            <!--
                外键
                   sid为student_course表中的一个外键
             -->
            <key>
                <column name="sid"></column>
            </key>
            <!--
                column
                      外键
             -->
            <many-to-many class="cn.itcast.sh08.hibernate.domain.Course" column="cid"></many-to-many>
        </set>
    </class>

持久化文件:

    course的:
    private Long cid;
    private String name;
    private Set<Student> students;
--------------------------------------------
    student的:
    private Long sid;
    private String name;
    private Set<Course> courses;

案例:

保存学生的同时保存课程

说明:

当执行session.flush的时候,hibernate内部的工作为:

1、保存学生

2、因为有cascade属性,所以要检查student中的set集合从而保存课程

3、因为inverse属性没有写,所以默认值为false,维护关系,所以要发出维护关系的sql语句

多对多的级联操作将会生成第三张表

删除课程

说明:

因为课程本身维护关系,所以在删除课程之间,hibernate内部会自动解除关系,然后再删除课程

总结

1、谁维护关系效率都一样

2、客户端的代码怎么写看发出的sql语句越少效率越高

3、关系的维护

建立关系:在第三张表中增加一行记录

解除关系:在第三张表中删除一行记录

重新建立关系:先删除后增加

一对一

一对一很简单,要注意的地方只有一个:
就是在<one-to-one>中需要有unique=“true” 并且还有column=“cid”表示cid在student表中是唯一的
时间: 2024-10-19 20:01:18

Hibernate入门(五)hibernate的级联(cascade)表操作的相关文章

Hibernate Annotation关系映射, 级联cascade属性

Hibernate Annotation关系映射, 级联cascade属性一. Hibernate Annotation关系映射 1.一对一外键关联映射(单向) 2.一对一外键关联映射(双向) 3.一对一主键关联映射(不重要)在这不演示 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成.Annotation注解一对

Hibernate 入门 04 - Hibernate中Java对象的三种状态

目录:(后续不断更新...) Hibernate 入门 01 - 框架技术 (介绍Hibernate框架的发展由来) Hibernate 入门 02 - Hibernate介绍及其环境搭建 Hibernate 入门 03 - 使用Hibernate完成持久化操作 Hibernate 入门 04 - Hibernate中Java对象的三种状态 ▁▃▅ Hibernate中Java对象的三种状态▅▃▁ 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久

Hibernate 入门 02 - Hibernate介绍及其环境搭建

昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归路.呵呵. 目录: 数据持久化概念 Hiberante框架及ORM2.1. Hibernate框架2.2. 什么是ORM2.3. Hibernate框架的优缺点及其适用场合 2.4.1 Hibernate框架的优点 2.4.2 Hibernate框架的缺点2.4. Hibernate环境搭建2.5. 技能训练2.6. 练习 1.数据持久化概念 数

hibernate学习五 Hibernate补充

1  MiddleGenIDE可以生成映射类和映射文件. 2 原文地址:https://www.cnblogs.com/liufei1983/p/8635468.html

Hibernate 入门教程(总结)

在前面4篇文章,我把Hibernate中的常规配置.单张表操作.一对一单双边配置.一对多.多对一单双边配置.多对多单双边配置及数据库操作都讲了一遍,如果有的地方说错了或者不明白的地方,还请大家指正.我再把几篇文章的地址发一下,方便大家查阅 一.Hibernate入门教程 第一章Hibernate的简单配置.单张表的增删改查操作(student为例) 地址:http://blog.csdn.net/zhangpan19910604/article/details/46654233 二.Hibern

Hive命令行常用操作(数据库操作,表操作)

数据库操作 查看所有的数据库 hive> show databases ; 使用数据库default hive> use default; 查看数据库信息 hive > describe database default; OK db_name comment location owner_name owner_type parameters default Default Hive database hdfs://hadoop1:8020/user/hive/warehouse pub

Hibernate入门(五)

一 Hibernate继承映射 我们可以将继承层次结构类与数据库的表映射. 1. 每个层次类一张表 这个层次结构有三个类,Employee是Regular_Employee和Contract_Employee类的超类(父类). 此层次结构的表结构如下所示: XML实现 1)创建持久化类 Employee.java package cn; public class Employee { private int id; private String name; public int getId()

走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

微信公众号[黄小斜]大厂程序员,互联网行业新知,终身学习践行者.关注后回复「Java」.「Python」.「C++」.「大数据」.「机器学习」.「算法」.「AI」.「Android」.「前端」.「iOS」.「考研」.「BAT」.「校招」.「笔试」.「面试」.「面经」.「计算机基础」.「LeetCode」 等关键字可以获取对应的免费学习资料. ? Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hiber

Hibernate入门篇&lt;1&gt;hibernate.cfg.xml学习小结

Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性,这个配置文件应该位于应用程序或Web程序的类文件夹 classes中.Hibernate配置文件支持两种形式,一种是xml格式的配置文件,另一种是Java属性文件格式的配置文件,采用"键=值"的形式.建议采用xml格式的配置文件,xml配置文件可以直接对映射文件进行配置,并由Hibernate自动加载,而properties文件则必须在程序中通过编码加载映射文件. 一)hibernate配置文件模