默认:none

Cascade 属性值:

none:在保存、删除修改对象的时候,不考虑其附属物的操作

save-update:在保存、更新当前对象时,级联保存、更新附属物。

delete:在删除当前对象时,级联删除附属物。

all: 包含save-update和delete的操作

delete-orphan:删除和当前对象解除关系的附属对象。

NONE:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.Team" table="team" catalog="test" lazy="true"> 
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" >
                
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="Name" />
        </property>
        <set name="students"  cascade="none" lazy="false" batch-size="3">
            <key column="teamID"></key>
            <one-to-many class="com.vo.Student"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

代码:

Session session = SessionUtil.getSession();
  Transaction tran = session.beginTransaction();
  Team team = (Team)session.get(Team.class, 4);

Student addStu = new Student();

addStu.setName("test");
  Student removeStu = (Student)session.get(Student.class, 15);
  team.getStudents().remove(removeStu);
  team.getStudents().add(addStu);
  tran.commit();
  session.close();

会报异常,异常原因是提示addStu为临时对象,他被持久化对象引用,而cascade="none",不能通过使用级联进行保存,所以异常是建议在清理缓存之前保存临时对象。

save-update

更改为cascade="save-update"

运行成功!对象已经被保存。但是发现所删除的student,并没有真正被删除,而只是将team_id设为了NULL,

结论是:从集合中删除已个对象并不会导致此对象在数据库中对应的记录删除,而只是将所对应的关联字段设置为了NULL。

delete

如果cascade设为delete,那么删除主题数据的时候,会级联删除所关联的对象。

delete-orphan

当你要删除集合中对象的时候,要采用这种方式:

Team team = (Team)session.get(Team.class, 10);
  Student removeStu = (Student)session.get(Student.class, 21);
  team.getStudents().remove(removeStu);

Team.hbm.xml

<set name="students"  cascade="delete-orphan"  lazy="true" batch-size="3">
            <key column="teamID"></key>
            <one-to-many class="com.vo.Student"></one-to-many>
        </set>

Student.hbm.xml

<many-to-one name="teamID" column="TeamID"  fetch="join"></many-to-one>

在STUDENT中不能设置cascade="all"

因为根据程序,当删除ID为21的学生时候,如果加了cascade="all"那么就是告诉程序去级联删除与之有关的TEAM,也就是将ID为10的TEAM也干掉了。如果干掉了ID为10的TEAM,那么与之有关的Student也将被删除,非常的危险。

所以一定要注意。

如果设置cascade="all",则在调用session.delete(team);时,会删除TEAM下的所有STUDENT;如果是调用team.getStudents().remove(stu);然后调用session.update(team)不会删除此STU,只会把该STU的TEAM_ID设为NULL,所以想通过集合删除对象,需要设置cascade="delte-orphan"

hibernate cascade的更多相关文章

  1. hibernate cascade的真正含义

    hibernate cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的属性,表示级联操作. /** * (Optional) The o ...

  2. hibernate cascade=CascadeType.All

    因为时间关系,我在这里测试的环境是一对多的关系里面用到的注解方式的级联,网上也有很多贴子,我也看过了,但是呢,我还是自己总结一下吧,这觉得级联是单向的,不是双向的,意思就是说,我们在设置两个类的对象之 ...

  3. Hibernate Cascade & Inverse

    Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...

  4. Hibernate cascade级联

    cascade: 级联: 是对象的连锁操作 级联保存(一对多): 级联保存: 当保存双向关系的一方时,默认会报告错误,此时应该在customr中设置级联保存,即操作一个对象时,通过操作其他关联对象 如 ...

  5. hibernate CasCade deleted object ould be re-saved by cascade

    这个问题个人认为看你用的那种方式,如果是注解式的 比如: @ManyToMany(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType. ...

  6. hibernate cascade属性

    cascade属性是存在于set标签中,用来做级联删除和保存. 它的值有以下几种: 1)默认值是none,不做级联动作: 2)save-update:级联保存 3)delete:级联删除 4)all: ...

  7. SQLAlchemy模型使用

    SQLAchemy模型使用 简介: SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用 ...

  8. URLs ...

    各浏览器对ES6的支持 https://blog.csdn.net/lpw_cn/article/details/84789183 http://kangax.github.io/compat-tab ...

  9. hibernate笔记--cascade级联以及inverse属性

    cascade : 不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例, ...

随机推荐

  1. Android Studio 创建/打开项目时一直处于Building“project name”Gradle project info 的解决

    最近发现新版的AS,IDEA毛病不断,而且gradle的更新又给墙了,无奈啊! 进入类似如下的目录,发现如果没有对应的gradle解压文件,则在gradle官网下载完整压缩包,放入类似55xxxx串号 ...

  2. Redis学习基础二

    回顾:上一基础中已了解 ( 什么是redis .redis 的三大特点.安装,和数据配置) 接下来浅尝Redis的数据类型,时间煮雨...... 一.Redis数据类型 redis支持五中数据类型(s ...

  3. 预读(读取文件前几行)文件(txt,dat,csv等)程序

    需求: txt.dat.csv文件很大,需要花很长的时间打开, 但实际上我们只需要查看文件的前几行,查看数据的内容和格式 exe & code :  https://github.com/co ...

  4. 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数

    FIFO.LRU.OPT这三种置换算法的缺页次数 转载  由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...

  5. Kubernetes PV/PVC使用实践

    转载于https://www.cnblogs.com/ericnie/p/7733281.html   pv,pvc的概念不解释了,之前在registry中已经使用过PV和PVC,现在想把WebLog ...

  6. php中文网在这里给大家汇总了最热门最全面的php面试题

    PHP面试题汇总 视频版: 1.<最新PHP面试视频教程> http://www.php.cn/course/876.html 2.<PHP经典算法面试题> http://ww ...

  7. 我们使用git checkout 将B分支上的部分页面代码 添加或覆盖到A分支上

    $ git branch * A B $ git checkout B message.html message.css message.js other.js $ git status # On b ...

  8. 安装ucenter discuzX

    需要先安装ucenter再安装discuzX!! ucenter下载,官网上不大好下载: http://www.comsenz.com/downloads/install/ucenter 下载不了; ...

  9. React.js基础入门

    本文主要是针对React的一些demo教程.参考了菜鸟教程中的react教程,做了一些总结.Demo的下载链接是 https://github.com/RealAndMe/react-demo 下面要 ...

  10. Spring boot学习总结

    引言之前也没有深入学习过spring框架,最近SpringBoot流行起来后想补下这方面的知识,于是照着SpringBoot官网上的英文教程开始helloworld入门,踩到几个小坑,记录下学习流程. ...