总结:

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. Redis源码阅读之主从复制——Slave视角

    Redis主从复制 为了提高性能和系统可用,Redis都会做主从复制,一来可以分担主库压力,二来在主库挂掉的时候从库依旧可以提供服务.Redis的主从复制是异步复制,返回结果给客户端和同步命令到从库是 ...

  2. PHP树结构,实现无限分级

    一.从数据库查出来的数据需要id.parentid.level. id唯一识别栏目,parentid为该栏目所属父类id,level标示该栏目是几级栏目.以下代码就可以实现一个简单的树结构. publ ...

  3. [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]

    题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...

  4. Jenkins中的一些问题解决(~~不断更新~~)

    请使用ctrl+F,查询页面中你需要查找的错误信息(注意空格的输入) 1.错误"error fetching remote repo origin" 本地有多个sshkey,导致构 ...

  5. (转)java反射机制及简单工厂模式

    第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...

  6. 为什么 1000 == 1000会返回false,100 == 100会返回true

    给你们看一段神奇的代码 /*对这段代码可以提供如下解释 * 判断两个对象是否相等的是看两个对象的引用是否相同 如果相同那么就返回true否则返回false * Integer会对-128~127之间的 ...

  7. angular JS中使用jquery datatable添加ng-click事件

    'use strict'; app.controller('DataTableCtrl', function ($scope, $compile) { $scope.show = function ( ...

  8. EF 直接修改数据,不再查询数据库

    public int UpData(T model, params string[] proNames) { //4.1将 对象 添加到 EF中 DbEntityEntry entry = null; ...

  9. Android学习笔记- Fragment实例 底部导航栏的实现

    1.要实现的效果图以及工程目录结构: 先看看效果图吧: 接着看看我们的工程的目录结构: 2.实现流程: Step 1:写下底部选项的一些资源文件 我们从图上可以看到,我们底部的每一项点击的时候都有不同 ...

  10. ARCH和LGWR进程同步DG日志的区别

    ARCH和LGWR进程同步DG日志的区别 我在做Standby RAC实验时,起初使用的是ARCH传输,后来将其改为LGWR传输(实际是LGWR分出的小工进程LNS): --之前的设置 alter s ...