MySql和Hibernate中关于cascade的用法
数据库里的cascade的用法,Mysql和Hibernate里面是不相同。
在数据库里,进行增加、修改、删除记录的时候,经常会涉及到父子关系的表。
例如:有省份表和城市表,其中城市表有一个外键province_id引用到省份表的主键。这样,可以把省份表看成是父表,把城市表看成是子表,城市表记录的存在依赖于省份表的记录。(文中提到的例子,所有的代码在附件里都有,所以这里的描述从简)
一、在MySQL里的cascade
以下直接在MySQL的控制台操作省份表和城市表
在省份表增加一条“广东”的记录,在城市表增加一条“广州”的记录,并且把“广州”的外键引用到“广东”的主键。“广州”的存在依赖于“广东”,如果删除省份表的“广东”,将会影响到城市表的“广州”。根据城市表的外键约束的on delete设置,有如下三种情况:
1、外键没有on delete的设置:当删除“广东”的时候,MySQL会报错,删除失败。
2、外键设置为on delete cascade:当删除“广东”的时候,同时把“广州”也删除。
3、外键设置为on delete set null:当删除“广东”的时候,“广州”的外键province_id会被自动设置为null,即“广州”脱离了对“广东”的依赖关系。
二、在Hibernate里的cascade
以下用Hibernate来操作省份表和城市表
首先,在hibernate.cfg.xml文件配置好连接MySQL数据库的相关属性(请在那里修改登陆数据库的密码)。然后,为省份表和城市表添加相关的POJO类和XML映射文件。用SQL语句建表(在附件的test_cascade.sql里),城市表有一个外键province_id引用到省份表的主键,并把这个外键设置为on delete cascade。这个外键约束,在Hibernate变成了双向的映射关系:City类有一个类型为Province的province属性,关联到省份表,在映射文件中是many-to-one的关系;Province类有一个Set<City>的cities属性,关联到城市表,在映射文件中是one-to-many的关系。
在Hibernate的映射文件里,同样可以设置cascade属性来控制父子关系。通常在父表设置cascade属性,有以下几种情况:
1、没有设置cascade属性
用方法addInNoCascade()增加记录“广东”和“广州”(方法在类CityManager里,以下同),再用方法delete()删除“广东”,将会出现异常,系统会说因为“广东”被城市表外键关联了而不能删除。用SQL建表时,已经把外键设为on delete cascade,怎么不能把“广东”删除的同时,级联删除“广州”呢?用MyEclipse查看城市表,发现有两个外键
第2个外键是用SQL建表时生成的,设置了on delete cascade;而第1个外键应该是用Hibernate操作数据库时,Hibernate自动建立的。第1个外键的On delete被设置为No action,因此删除“广东”的时候,受到这个外键的限制,导致删除失败。
2、设置cascade属性为delete-orphan
在映射文件Province.hbm.xml中,在one-to-many关系对应的Set里,设置cascade="delete-orphan",此功能与MySQL里设置外键设置为on delete cascade相同。再用方法delete()删除“广东”,删除成功。即是,设置cascade为delete-orphan以后,对删除父表记录的时候,会同时删除子表的相关记录。
3、设置cascade属性为all
cascade的属性,除了可以是delete-orphan,还可以是create、update、delete、all等等。all代表除 delete-orphan以外的所有属性值,当设置cascade为all以后,对父表记录的增加、修改操作,会影响到子表的相关记录。
在映射文件Province.hbm.xml中,在one-to-many关系对应的Set里,设置cascade="all"。用方法 addInCascadeOfAll()增加记录“广东”,方法里只有save“广东”,并没有save“深圳”,只是用属性关联了“广东”和“深圳”的关系。结果显示,深圳也被添加到数据库里,这就是cascade="all"的作用,使对父表的操作影响到子表。
注意:A、delete-orphan是一个特别的属性值,只能应用在one-to-many关系的cascade属性。B、cascade属性通常在one-to-one和one-to-many关系里应用,不推荐在many-to-one或者many-to- many关系里应用。
三、总结
1、MySQL里设置cascade和在Hibernate设置cascade是不同的。在MySQL里设置了cascade,并不能对Hibernate的操作起到作用,原因是Hibernate自动为子表添加了外键。
2、使用级联(cascade)功能,方便了数据库的操作,使得操作一个表的记录会影响到其他表的记录。但是,级联功能会带来安全隐患。特别是在 Hibernate里,修改一个POJO对象的映射引用属性,会导致该引用属性所对应的POJO对象受到影响。例如,把“广东”的 Set<City>类型的cities属性清空(即对集合Set调用clear()方法),则会导致把引用“广东”的“深圳”删除了。因此,使用级联功能时要小心谨慎。
MySql和Hibernate中关于cascade的用法的更多相关文章
- Hibernate中Criteria的完整用法2
Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(E ...
- Hibernate中Criteria的完整用法
1,CriteriaHibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .2,De ...
- hibernate中的cascade和inverse
以Student和class为例,一个Student对应一个class,一个class对应多个Student. Student.hbm.xml <?xml version="1.0&q ...
- 【hibernate criteria】hibernate中criteria的完整用法 转
---恢复内容开始--- 转自:http://www.360doc.com/content/090313/10/26262_2794855.html 1.Criteria Hibernate 设计了 ...
- Hibernate中Criteria的完整用法?
http://www.cnblogs.com/mabaishui/archive/2009/10/16/1584510.html
- 记录一下 mysql 的查询中like字段的用法
SELECT * from t_yymp_auth_role where role_name not like '%测试%' and role_name not like '%部门%' and rol ...
- Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o
Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 主要的对象黑头配置磊 ...
- Hibernate之Criteria的完整用法
Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(E ...
- hibernate中get,load,list,iterate的用法及比较
首先,get和load都是查询单个对象,而list和iterate为批量查询 注意以下写法仅针对hibernate3的语法. 使用案例如下: // 1. get和load 的用法 Person p = ...
随机推荐
- WPF 多线程处理(3)
WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 首先我们需要几个属性来保存取得的数据,因为在 ...
- WebApi参数传递总结
在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...
- c++ 获取本地ip地址
最终版本:采用指针传参数,不使用别名形式. #include <unistd.h> #include <netdb.h> //gethostbyname #include &l ...
- 剑指offer--面试题8
题目:求旋转数组中的最小数字 以下为自己所写代码: #include "stdafx.h" #include <iostream> #include <excep ...
- SQL 中的游标实例
--声明变量 declare @IMType varchar(10),@IMResourceID varchar(10) --定义游标 declare information_cursor curso ...
- 实战案例--Grunt构建Web程序
GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...
- NET 使用HtmlAgilityPack抓取网页数据
刚刚学习了XPath路径表达式,主要是对XML文档中的节点进行搜索,通过XPath表达式可以对XML文档中的节点位置进行快速定位和访问,html也是也是一种类似于xml的标记语言,但是语法没有那么严谨 ...
- Spring多资源文件properties的配置
Spring简化了加载资源文件的配置,可以通过<context:property-placeholder去加载,这个元素的写法如下: <context:property-placehold ...
- Tomcat处理HTTP请求源码分析(上)(转)
转载自:http://www.infoq.com/cn/articles/zh-tomcat-http-request-1 很多开源应用服务器都是集成tomcat作为web container的,而且 ...
- C# 常用对象的的修饰符
class(类) 1.internal 表示类只能在当然程序集中访问,类默认修饰符 2.public 表示所有地方都可以访问,与internal是互斥的 3.abstract 抽象类,不能被实例化,只 ...