数据库里的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的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类型的cities属性清空(即对集合Set调用clear()方法),则会导致把引用“广东”的“深圳”删除了。因此,使用级联功能时要小心谨慎。

mysql cascade的用法_MySql和Hibernate中关于cascade的用法相关推荐

  1. mysql查询语句 变量_mysql查询语句中用户变量的使用

    先上代码吧 SELECT `notice`.`id` , `notice`.`fid` , `notice`.`has_read` , `notice`.`notice_time` , `notice ...

  2. mysql操作json优点和缺点_MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?...

    在MySQL 5.7中,新的数据类型用于在JSON表中存储JSON数据. 添加. 显然,这将是MySQL的巨大变化. 他们列出了一些好处 Document Validation - Only vali ...

  3. mysql ignore用法_mysql insert 语句中的 ignore 关键字的作用

    IGNORE:表明,如果你插入的行已经存在,则成功返回,不会报错(会有警告),忽略当前插入的记录,不使用IGNORE时,如果插入了相同的行数据时,MySQL则会报错. MySQL是通过主键来判断两个行 ...

  4. mysql 中like用法_mysql查询语句中like 的用法

    1.常见用法: (1)搭配%使用 %代表一个或多个字符的通配符,譬如查询字段name中以大开头的数据: (2)搭配_使用 _代表仅仅一个字符的通配符,把上面那条查询语句中的%改为_,会发现只能查询出一 ...

  5. hibernate mysql 外键_如何在hibernate中设置关联会在数据库中生成外键

    hibernate学习笔记(三) hibernate的一些杂记:1.sessionFactory的用法:SessionFactory是线程安全的,构造 SessionFactory 很消耗资源sess ...

  6. hibernate中criteria的一些用法

    最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 ...

  7. Hibernate中Criteria的完整用法

    转自:http://www.cnblogs.com/mabaishui/archive/2009/10/16/1584510.html 1,Criteria  Hibernate 设计了 Criter ...

  8. mysql union all 别名_mysql union 与 union all 语法及用法

    1.mysql   union  语法 mysql   union 用于把来自多个select  语句的结果组合到一个结果集合中.语法为: select  column,......from tabl ...

  9. 【hibernate criteria】hibernate中criteria的完整用法 转

    ---恢复内容开始--- 转自:http://www.360doc.com/content/090313/10/26262_2794855.html 1.Criteria Hibernate 设计了 ...

最新文章

  1. 情境感知技术是什么?
  2. 接口自动化测试的几个阶段
  3. er图转为数据流程图_draw.io for Mac(流程图绘制工具)
  4. java io密集型任务_Java线程池讲解——针对IO密集型任务
  5. java 泰勒级数_鸡群优化算法(CSO)、蜻蜓算法(DA)、乌鸦搜索算法(CSA)、泰勒级数(Taylor series)...
  6. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记
  7. mysql怎么分组查询所有数据库_Mysql-4 分组查询与子查询
  8. python中什么叫类、什么叫对象_python中的类面向对象的基本概念!
  9. matlab求z score,matlab标准化和反标准化——zscore
  10. 精品手机看片神器电影网址导航网站
  11. windows 10 彻底卸载windows 易升
  12. C语言typedef用法详解
  13. zabbix 清理历史数据
  14. 【小家java】Java中主线程(父线程)与子线程的通信和联系
  15. 如何解决移动硬盘弹出时报错:设备正在使用中
  16. 触碰岁月——土楼潇洒穷游记
  17. BLE广播包4种类型
  18. 切绳子【洛谷P1577】【二分】
  19. 黑马程序员------黑马基础测试题参考
  20. node笔记随笔---kalrry

热门文章

  1. springboot快速开发框架推荐,接私活利器
  2. C# SaveFileDialog使用
  3. DECIMAL数据类型
  4. 用Python爬虫的request方式实现自动签到
  5. 10种网络安全攻击方式详解!
  6. warning - Launch image are deprecated in iOS13.0. Use a launch storyboard or XIB instead
  7. ossfs挂载百度对象存储_阿里云对象存储OSS挂载工具
  8. 更新补丁引发系统性瘫痪,VMware替换势在必行
  9. Linkedin Databus
  10. 技术分享 | MySQL : SSL 连接浅析