总结:

Cascade:对级联操作进行限制,有如下几个参数:

  all : 所有情况下均进行关联操作。 
  none:所有情况下均不进行关联操作。这是默认值。 
  save-update:在执行save/update/saveOrUpdate时进行关联操作。 
  delete:在执行delete时进行关联操作。

Inverse:在一对多模型中,只能在一的一方设置,inverse的作用就是在级联发生后,会再次更新子表数据的外键为主表的主键。确保子表外键不会为空。

下面演示一个班级学生的例子(一对多):

班级表javabean

public class Classes {

private Integer c_id;

private String c_name;

private String c_desc;

private Set<Student> student;

...}

班级表mapping

.....其他字段省略,只写关联部分的代码

<set name="student" table="STUDENT" cascade="save-update" inverse="false" lazy="true">

<key>

<column name="C_ID" />//此处对应子表外键约束名

</key>

<one-to-many class="com.cky.model.Student" />

</set>

学生表bean如下

public class Student {

private Integer s_id;

private String s_name;

private Integer s_age;

private Classes cls;

....}

学生表mapping

...其他字段省略,只写关联部分的代码

<many-to-one name="cls"  cascade="save-update" class="com.cky.model.Classes" fetch="join">

<column name="C_ID" />//自己的外键约束名

</many-to-one>

Classes 和Student是一对多关系,验证inverse作用

1、当classes的 descade=”save-update” inverse=”false”或者不写(默认false)

执行如下操作:

Student st1=new Student("st1", 11);

Student st2=new Student("st2", 17);

Set<Student> stus=new HashSet<Student>();

stus.add(st1);

stus.add(st2);

//上面是创建两个学生对象,并添加到stus集合中

//下面是创建classes对象,并将学生集合传入

Classes cls=new Classes("班级1", "lal", stus);

ss.save(cls);

执行结果:注意最后的两个更新操作

Hibernate: select max(C_ID) from CLASSES

Hibernate: select max(S_ID) from STUDENT

Hibernate: insert into CLASSES (C_NAME, C_DESC, C_ID) values (?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

Hibernate: update STUDENT set C_ID=? where S_ID=?

Hibernate: update STUDENT set C_ID=? where S_ID=?

二、当classes的 descade=”save-update” inverse=”true”时

执行结果:注意没有update了

Hibernate: select max(C_ID) from CLASSES

Hibernate: select max(S_ID) from STUDENT

Hibernate: insert into CLASSES (C_NAME, C_DESC, C_ID) values (?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

从结果可以看出来,当放弃维护关系的时候,少了两个更新语句

Inverse:是否放弃维护关系,就是是否对子表外键的进行额外更新操作,保证子表外键是自己的主键。

当级联发生时,有两种情况:

1、如果inverse为false,即classes选择维护关系的话。首先级联添加时会把Student对象的值插入表,由于需要维护关系,所以他会再次更新这些数据的外键关系。

将外键更新成自己的主键,这样他们一定有关系了。

2、如果inverse为true,即classes不维护关系,首先级联添加时会把Student对象的值插入表,但不会再次更新这些数据的外键关系,如果数据没有外键,就是空的,所以可以看到第二次执行中,由于我们创建Student对象时没有指定classes,所以添加后表中的结果也是null。

总结:inverse只能在一的一方设置,inverse的作用就是在级联发生时,会再次更新子表数据的外键为主表的主键。确保子表外键不会为空。

正常情况都是将inverse设置成true来加快速度,子表数据的外键在创建子表对象时就设置好。

Hibernate级联操作解密(inverse和cascade)的更多相关文章

  1. Hibernate级联操作和载入机制(二) cascade and fetch

    上一篇介绍了Hibernate持久化对象时候的级联操作.本篇介绍读取时候的级联操作. 还是用上一篇的样例.一份问卷有多个问题.可是每一个问题仅仅能属于一份问卷. 我们先看測试用例: @Test pub ...

  2. Hibernate级联操作 注解

    EJB3 支持的操作类型 /** * Cascade types (can override default EJB3 cascades */ public enum CascadeType { AL ...

  3. Hibernate级联操作

    cascade属性的可能值有 all: 所有情况下均进行关联操作,即save-update和delete. none: 所有情况下均不进行关联操作.这是默认值. save-update: 在执行sav ...

  4. springdata 一对多 级联操作 在注解里面开启级联操作@OneToMany(mappedBy = "customer",cascade = CascadeType.ALL)

  5. Hibernate的Cascade——级联操作

    在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...

  6. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  7. hibernate级联 cascade属性(转)

    在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...

  8. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  9. 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作

    这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制. 依旧用部门和员工举例.多个员工相应一个部门(多对一关联关系) 员工类:Employee.java package cn ...

随机推荐

  1. 每天来点Java面试题(一)

    (1)java 中的 static  字段的 使用: 什么是 static ? 它是 java 的修饰符,定义静态变量和静态方法. 什么时候用? 通常用在工具类里面,修饰静态方法,然后供其它类的方法使 ...

  2. C# Web.config配置

    使用 <!--M002 バッチを起動のPath配置--> <add key="BM0002_START_PATH" value="D:\BM0002\B ...

  3. zip & tar 压缩文件时排除某个文件夹

    确实是用参数 -x aaa bbb 两个文件夹要写全路径. 如 zip -r test.zip test -x /test/aaa/* -x /test/bbb/* 既包含了文件夹,也可以 zip - ...

  4. maven项目打包发布时跳过测试

    mvn命令: mvn clean install -Dmaven.test.skip=true eclipse build... 命令: clean install -Dmaven.test.skip ...

  5. matlab图片清晰度调整

    打开.fig文件后: 1.首先设置窗口中的文字大小和相关的图例 2.然后将窗口缩小到要在word中或者ppt中展示图片的大小(避免图片缩小减少清晰度) 3.调整横纵坐标说明,使得布局合理 4.点击Ei ...

  6. Verilog HDL常用综合语法

    前面已经记录了一些组成Verilog的基本组成,可以用这些基本组成来构成表达式.这一节,就来记录一下把这些表达式构成一个文件的各种行为描述语句. ①这里用Verilog基本要素进行的行为描述主要是针对 ...

  7. 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼

    2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼   转眼又已过去了一年,在这一年里,Firefox 和 Chrome 在拼升级,版本号不断飙升:IE10 随着 Windows 8 在 ...

  8. 设计模式(二) 策略模式Strategy

    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身 ...

  9. SpringBoot初识(一)

    一.什么是SpringBoot 最近几年,微服务的概念越来越火.而相信大家在搜索微服务时,映入眼帘的首先就是SpringBoot以及SpringCloud.SpringCloud提供的一套完整的微服务 ...

  10. ios UIButton改背景

    以下orangeButton.png与orangeButtonHighlight.png分别用于按钮平常状态和被点击时的状态: UIImage *buttonImage = [[UIImage ima ...