具体解释Hibernate中cascade与inverse

学习hibernate的时候对级联关系的概念老是分不清楚,尤其是cascade、inverse傻傻分不清。以下通过样例来简单说明。

准备工作:

首先创建数据库,新建两张表:

教室表classes (字段此处省)

学生表student(字段此处省)

教室与学生是一对多的关系。 然后新建项目,加入hibernate对两张表的支持。

1.cascade

cascade表示级联操作。即两个实体间存在级联关系(一个类是还有一个类中的属性)时,当保存、更新或删除一个实体时,是否对关联的实体做出相应操作(数据库操作),比如:

保存班级级联保存学生:

在Classes.hbm.xml配置文件里做例如以下改动:

如今运行例如以下的代码:

这样在保存classes的时候的时候会自己主动在数据库中加入两个新学生。

说明:

  • 在hibernate中,通过session.save方法保存一个持久化对象这样的方式称为显示保存。

  • 在hibernate中,通过级联的方式来操作一个对象。这样的方式称为隐式操作。
  • 对student对象进行了隐式的保存操作,是由于student是一个暂时状态的对象。在数据库中没有相应的记录,所以应该对student运行insert语句

更新班级级联更新学生:

说明:

  • 当运行108行的时候,产生了例如以下的sql语句

  • 在运行110行代码的时候,产生了例如以下的sql语句

  • 运行114行代码的时候。产生了例如以下的sql语句

该update语句产生了3条,由于该班级中有3个学生,3个学生的属性同一时候发生改变。

  • 没有发出更新classes的update语句。由于classes的属性没有发生改变。

删除班级级联删除学生:

设置Classes.hbm.xml的Cascade为Delete

此时此classes包括的所以的student都一并删除了。注意在假设不设置级联删除则无法删除被外键引用的对象。

总结

Cascade:

  • Save-update

    在session.save/update一个对象的时候,级联操作关联对象,关联对象或者运行save语句或者运行update语句或者什么都不运行

  • Delete

    在session.delete一个对象的时候,级联删除关联对象

  • All

    Save-update和delete的结合

2.inverse

inverse属性用于指示本方是否參与维护关系。设为true时不维护,设为false时维护。

此处的关系是指关联两张表的

外键或者关系表字段。

本属性一般设置于一对多关系中的一端。而且设置为false。由于若由一端负责维护,每次更新完一端数据,都会去寻找于一端有关系的多段表中的行,并更新其外键字段。而由多端维护时。由于一端对象是多端对象的属性字段,所以,每次更新多端后提交数据。都会自己主动更新该字段(若有更新时),这样比較方便。

3.Cascade与inverse的差别 student 与 classes

  • cascade描写叙述的是对象与对象之间的关系

cascade和外键没有关系,在student表中。sid、name、description和cascade有关系,可是cid和cascade没有关系。

  • inverse描写叙述的是对象与外键之间的关系

inverse仅仅和cid有关系。假设维护。则发出update语句(更新外键的sql语句)。假设不维护,则无论。

  • inverse属性默认是false的,就是说关系的两端都来维护关系。当设置inverse=”true”时则不维护

4.仅仅有inverse没有cascade的时候:

对于数据中不存在的classes和student时:把student设置给classes时,仅仅保存classes而不直接保存student时仅仅会运行insert classes的方法而对于student(即使不存在)不会insert而仅仅会update(由于在同一个事物中所以终于导致classes也不能被保存)

当要保存的classes设置的student是数据库中存在的时候,会对其运行update方法,而假设对classes设置了cascade,则会对不存在的student设置insert:

当给classes设置inverse=”true”时。则表示classes不维护和student的外键关系。此时当删除一个classes时,由于classes不维护与student的关系,顾不会发出update语句所以会报错。而假设classes没有设置inverse=”true”,即inverse=”false”,则说明classes维护关系。故当删除classes时会发出update student的语句,故能够删除成功.

5.正确的设置inverse

我们说inverse设立不当会导致性能低下,事实上是说inverse设立不当,会产生多余反复的SQL语句甚至致使JDBC exception的throw。

这是我们在建立实体类关系时必须须要关注的地方。

一般来说,inverse=true是推荐使用,双向关联中两方都设置 inverse=false的话,必会导致两方都反复更新同一个关系。

可是假设两方都设立inverse=true的话,两方都不维护关系的更新,这也是不行的,好在一对多中的多端:one-to-many默认是inverse=false,避免了这样的错误的产生。可是多对多就没有这个默认设置了,所以非常多人常常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是由于他们两方都没有责任维护关系。所以说,双向关联中最好的设置是一端为inverse=true。一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了。 many-to-many两边都是多的。inverse究竟放在哪儿?事实上hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。

所以通用存在一对多的关系。也能够这样说:一对多是多对多的基本组成部分。

时间: 2024-07-28 16:15:45

具体解释Hibernate中cascade与inverse的相关文章

详解Hibernate中cascade与inverse

学习hibernate的时候对级联关系的概念老是分不清楚,尤其是cascade.inverse傻傻分不清.下面通过例子来简单说明. 准备工作: 首先创建数据库,新建两张表: 教室表classes (字段此处省) 学生表student(字段此处省) 教室与学生是一对多的关系. 然后新建项目,添加hibernate对两张表的支持. 1.cascade cascade表示级联操作,即两个实体间存在级联关系(一个类是另一个类中的属性)时,当保存.更新或删除一个实体时,是否对关联的实体做出相应操作(数据库

Hibernate中cascade和inverse的作用

Inverse和cascade是Hibernate映射中最难掌握的两个属性.两者都在对象的关联操作中发挥作用.1.明确inverse和cascade的作用inverse 决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因 为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用).cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关

Hibernate中cascade作用

Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade属性的可能值有    all: 所有情况下均进行关联操作,即save-update和delete.    none: 所有情况下均不进行关联操作.这是默认值. save-update: 在执行save/update/saveOrUpdate时进行关联操作.     delete: 在执行delete

具体解释Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存.是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把

hibernate中 cascade属性详解

配置关联时,我们考虑两点:程序执行效率和实际业务需要,前面的例子中无论是单向的关联还是双向的关联,我们都要分别对实体类使用session.save()才能将数据保存至数据库.问题:如果保存数据非常多,那编码是一件恐怖的事情.有没有简单的方法呢?将<set>标签cascade=all总结:我们只对district对象执行了持久化操作,但是通过sql语句,我们发现street执行了持久啊操作,这就是cascade属性的作用.当设置cascade属性不none时,Hibernate会持久化所关联的对

hibernate 之 cascade 和 inverse

一. Cascade 级联: many-to-one 中使用cascade: none : 不使用级联  (默认) save-update :当保存和更新的级联操作并关联对象 (推荐) <many-to-one name="teacher" column="tid" cascade="save-update"/> 当保存多的一端数据时,发现多的一端数据所关联的一的一端的数据没有保存时,如果设置了cascade=save-update,

Hibernate中Cascade的取值

Cascade属性的取值有: 1.none:忽略其他关联的对象,默认值,无需设定. 2.save-update:当session通过save(),update(),saveOrUpdate()方法来保存或更新对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象. 3.persist:当session通过persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象. 4.merge:通过Session的merge()方法来保存当前对象时,会级联融合所有关联的游离对

Hibernate中cascade属性的区别

xml对于集合的级联操作属性cascade的取值可以是: none: 不级联操作,默认为none save-update:针对的是当对当前对象进行save或update操作时,要对想关联的对象进行save和update操作 delete:级联删除 all:包含所有情况delete,save-update delete-orphan:级联删除孤儿 all-delete-orphan:级联删除delete,也包含级联save-update.delete-orphan 例: 1 <set name=&qu

积淀和提高:hibernate中的inverse(反转)属性的作用

•在hibernate中通过对 inverse 属性的来决定是由双向关联的哪一方来维护表和表之间的关系. inverse = false 的为主动方,inverse = true 的为被动方, 由主动方负责维护关联关系 •在没有设置 inverse=true 的情况下,父子两边都维护父子   关系 •在 1-n 关系中,将 n 方设为主控方将有助于性能改善(如果要国家元首记住全国人民的名字,不是太可能,但要让全国人民知道国家元首,就容易的多) •在 1-N 关系中,若将 1 方设为主控方 –会额