数据库里的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的用法的更多相关文章

  1. Hibernate中Criteria的完整用法2

    Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(E ...

  2. Hibernate中Criteria的完整用法

    1,CriteriaHibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .2,De ...

  3. hibernate中的cascade和inverse

    以Student和class为例,一个Student对应一个class,一个class对应多个Student. Student.hbm.xml <?xml version="1.0&q ...

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

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

  5. Hibernate中Criteria的完整用法?

    http://www.cnblogs.com/mabaishui/archive/2009/10/16/1584510.html

  6. 记录一下 mysql 的查询中like字段的用法

    SELECT * from t_yymp_auth_role where role_name not like '%测试%' and role_name not like '%部门%' and rol ...

  7. Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o

    Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 主要的对象黑头配置磊 ...

  8. Hibernate之Criteria的完整用法

    Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Student.class); cri.add(E ...

  9. hibernate中get,load,list,iterate的用法及比较

    首先,get和load都是查询单个对象,而list和iterate为批量查询 注意以下写法仅针对hibernate3的语法. 使用案例如下: // 1. get和load 的用法 Person p = ...

随机推荐

  1. android studio 突然出现Gradle project sync failed 错误

    出现: 之前还是好好的,突然就出现Gradle project sync failed  错误,网上原因可能是工具的问题. 解决办法: 重新打开android studio就好了.不知道大家还有其他的 ...

  2. HTML5网页制作教程:HTML5块级链接

    网页制作Webjx文章简介:Web 标准中处处充满了打脸行为,这条规则现在已经失效了!在那篇文章发布一个月后,HTML5doctor 发表了 “Block-level” links in HTML5, ...

  3. 【BZOJ】【2157】旅游

    LCT 直到动手写拆边为点的时候才发现根本不会写……去orz了一下Hzwer(话说这题应该也用不着LCT吧……下次再换种姿势写一遍好了) /****************************** ...

  4. WP 类似扑克牌布局控件和类似扑克卡片控件

    一.说明 本文代码来源: <windows phone 7 程序设计> Charles Petzold 控件效果: 二.要点: 1.ItemControl.子项容器模板(ItemsCont ...

  5. Unity3D脚本中文系列教程(八)

    ◆ static var matrix : Matrix4x4 描述:设置用于渲染所有gizmos的矩阵. 类方法 ◆ Static function DrawCube(center:Vector3, ...

  6. 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持

    谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持 在本篇文章上一部分Order Processing的例 ...

  7. What are Scopes?

    scope is an object that refers to the application model. It is an execution context for expressions. ...

  8. HDU4758 Walk Through Squares AC自动机&&dp

    这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...

  9. java基础知识回顾之---java StringBuilder与StringBuffer异同点

    /*         * StringBuilder与StringBuffer异同点:         *          * 使用方法与StringBuffer完全一样         * Str ...

  10. 由CHAR(2)引发的BUG

    我们在设计数据库标志位字段时,为考虑其扩展性,一般会设置为CHAR(2),例如 FLAG CHAR(2),这样我们就需要注意了,如果你给字段 FLAG赋值为‘0’,它在数据库中的真实情况是‘0+空格’ ...