hibernate cascade
默认: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的更多相关文章
- hibernate cascade的真正含义
hibernate cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的属性,表示级联操作. /** * (Optional) The o ...
- hibernate cascade=CascadeType.All
因为时间关系,我在这里测试的环境是一对多的关系里面用到的注解方式的级联,网上也有很多贴子,我也看过了,但是呢,我还是自己总结一下吧,这觉得级联是单向的,不是双向的,意思就是说,我们在设置两个类的对象之 ...
- Hibernate Cascade & Inverse
Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...
- Hibernate cascade级联
cascade: 级联: 是对象的连锁操作 级联保存(一对多): 级联保存: 当保存双向关系的一方时,默认会报告错误,此时应该在customr中设置级联保存,即操作一个对象时,通过操作其他关联对象 如 ...
- hibernate CasCade deleted object ould be re-saved by cascade
这个问题个人认为看你用的那种方式,如果是注解式的 比如: @ManyToMany(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType. ...
- hibernate cascade属性
cascade属性是存在于set标签中,用来做级联删除和保存. 它的值有以下几种: 1)默认值是none,不做级联动作: 2)save-update:级联保存 3)delete:级联删除 4)all: ...
- SQLAlchemy模型使用
SQLAchemy模型使用 简介: SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用 ...
- URLs ...
各浏览器对ES6的支持 https://blog.csdn.net/lpw_cn/article/details/84789183 http://kangax.github.io/compat-tab ...
- hibernate笔记--cascade级联以及inverse属性
cascade : 不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例, ...
随机推荐
- bzoj3463【COCI2012】 Inspector
题目描述 在一个小国家中,一个新的小镇终于建成了!如往常一样,Mirko获得了“首席税务巡查员”的职位.他的任务是保证正确地计算各公司的收入情况.一共有N家办公室坐落在主干道上,从左到右被编号为1~N ...
- 【题解】Tree-String Problem Codeforces 291E AC自动机
Prelude 传送到Codeforces:(/ω\)--- (/ω•\) Solution 很水的一道题. 对查询的串建出来AC自动机,然后树上随便跑跑就行了. 为什么要写这篇题解呢? 我第一眼看到 ...
- STL中的优先级队列priority_queue
priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另 ...
- python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs
1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...
- Python【第三方模块&标准模块】
模块: 模块其实就是一个python文件 1.标准模块.标准包 #python自带的这些模块,直接import就能用的 import string,random,datetime,os,json 2. ...
- Kubernetes Deployment与Replica Set
Deployment相对于RC的优势 RS与Deployment主要用于替代RC.RS的全称为Replica Set.相对于RC,RS与Deployment的优势如下: RC只支持基于等式的selec ...
- Zabbix应用三:Zabbix监控MySQL
利用Zabbix自带模版监控(Template App MySQL)MySQL服务 一.添加模版: 进入zabbix页面,找到'配置'->'主机'->'模版',点击'链接指示器'后面的'选 ...
- 脑洞 博弈 E. Competitive Seagulls 2017 ACM Arabella Collegiate Programming Contest
题目链接:http://codeforces.com/gym/101350/problem/E 题目大意:给你一个长度为n的方格,方格上面都被染色成了白色.每次染色都是选择白色的,假设目前选择的这块白 ...
- 2016/1/3 Python中的多线程(2):threading模块
之前提了Python多线程的一点使用,今天介绍更好的threading模块,它提供了Thread类和一些比较好用的同步机制. 先介绍Thread类 threading模块中的Thread类有很多thr ...
- javascript 写了个字符串组合的情况
function log() { var i = 0, str = '', args = [].slice.call(arguments); j++; if (isRepeat(args)) { k+ ...