mysql cascade的用法_MySql和Hibernate中关于cascade的用法

本文对比了MySQL和Hibernate中级联(cascade)功能的不同用法,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的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()方法),则会导致把引用“广东”的“深圳”删除了。因此,使用级联功能时要小心谨慎。

03-30
### CASCADE 的基本概念 在编程数据库领域中,`CASCADE` 是一种用于处理级联操作的关键字。它通常被用来定义当某个对象发生更改时,其他依赖于该对象的对象应该如何响应。 #### 数据库中的 CASCADE 在关系型数据库管理系统 (RDBMS) 中,`CASCADE` 主要应用于外键约束(Foreign Key Constraints)。它的作用是在删除或更新父表中的记录时自动执行相应的操作到子表上[^1]。具体来说: - **ON DELETE CASCADE**: 当父表中的某条记录被删除时,所有关联的子表记录也会被自动删除。 - **ON UPDATE CASCADE**: 如果父表中的主键值发生变化,则会相应地更新子表中外键字段的值。 这种机制可以确保数据的一致性完整性,减少手动维护多张表格之间联系的工作量[^2]。 ```sql CREATE TABLE parent ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE child ( cid INT PRIMARY KEY, pid INT REFERENCES parent(id) ON DELETE CASCADE, -- 设置级联删除 cname VARCHAR(50) ); ``` 上述 SQL 脚本创建了一个 `parent` 表及其对应的 `child` 子表,并设置了 `ON DELETE CASCADE` 约束条件。这意味着如果从 `parent` 表中移除一条记录,那么任何引用此记录作为外键的 `child` 记录都将随之消失。 #### 编程环境下的 CASCADE 除了数据库之外,在某些高级程序设计模式或者框架里也可能遇到类似的术语。“Cascade” 可能指代一系列连续触发的动作序列;比如在一个面向对象的语言环境中调用方法链的时候可能会涉及到这样的逻辑控制流程管理思路。 例如,在图形界面开发工具包 GTK+ 中有一个名为 “Goblin”的图对象库支持网络编程问题解决方案提到过有关节点间相互影响传播的概念类似于这里讨论的数据层面上的操作行为表现形式。 尽管如此,“cascade” 并不是一个特定技术名称而更像是一种通用的设计理念体现方式之一而已。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值