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举例, ...
随机推荐
- 构建工具----gradle---可能遇到的问题----Could not reserve enough space for object heap
Could not reserve enough space for object heap 意思是 jvm的设置内存不足以运行gradle命令了. 分为两种情况,解决的方法也不同. .10/user ...
- Java考试题之五
QUESTION 102 Given: 23. Object [] myObjects = { 24. new Integer(12), 25. new String("foo") ...
- 【最小割】【网络流24题】【P2762】 太空飞行计划问题
Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使 ...
- RabbitMQ 中 Connection 和 Channel 详解
我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是 Connection. 一旦 TCP 连接建立起来,客户端紧接着可以创建一个 ...
- springcloud的分布式配置Config
1.为什么要统一配置管理? 微服务由多个服务构成,多个服务多个配置,则对这些配置需要集中管理.不同环境不同配置,运行期间动态调整,自动刷新. 统一管理微服务的配置:分布式配置管理的一些组件: zook ...
- 五、java面向对象编程_3
目录 十五.Object类 1.toString 2.equals 十六.对象转型(casting) 十七.动态绑定(多态) 十八.抽象类(abstract) 十九.final关键字 二十.接口 十五 ...
- CSS边框及常用样式
一.CSS设置样式 1.1 边框border 作用:设置标签周围的边框,方法 board:宽度 样式 颜色,一般情况下样式使用 solid实体的,和dotted虚线的 <head> &l ...
- 通过网络仓库建立本地的yum仓库
[root@kazihuo ~]# yum -y install createrepo yum-utils [root@kazihuo ~]# yum -y install https://mirro ...
- H264编码profile & level控制
背景知识 先科普一下profile&level.(这里讨论最常用的H264) H.264有四种画质级别,分别是baseline, extended, main, high: 1.Baseli ...
- Jdbc druid数据库连接池
//测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...