`
zuishengmengsi1990
  • 浏览: 10580 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

转:hibernate级联删除策略

阅读更多

数据库中的表一般都是相互关联的,它们通过foreign key产生关系。

 

定义foreign key约束时可以指定三种引用行为:delete cascade、delete set null、delete no action,默认是delete on action。它们的含义是:

 

1、delete cascade : 删除主表的同时也删除子表有关的记录

这个行为适合主从表关系较为紧密的情况,比如菜单和子菜单。当主表的记录不存在时,从表的数据已经没有意义,存在也是多余,所以当删除主表时,从表相关记录也一同删除。

 

2、delete set null : 删除主表时将子表外键设置为NULL

这个行为适合主从表关系不是相当密切的情况,比如角色和用户,一个角色可以对应多个用户(一个用户也可以有多重角色),不能因为删除了某个角色,而把属于这个角色的用户都删除了,因为这些用户可能还和其他表有很大关系。

 

3、delete no action: 不做任何操作

这个情况下,如果主表的某个记录已经被引用,删除这条记录会失败,主要提醒用户注意数据完整性。

 

以上3种情况在hibernate下如果实现呢?下面以多对一关联举例。

 

假设新闻与用户存在多对一关联

1、删除用户的同时也删除他发表的新闻

News映射文件:

<many-to-one name="editer" class="Account">

           <column name="editer_id"></column>

</many-to-one>

 

Account映射文件:

<set name="news"    lazy="true" cascade="delete" inverse="true">

       <!-- 主键对应的关联表外键 -->

       <key column=" editer_id"></key>

       <!-- 关联表 -->

       <one-to-many class="News"/>

</set>

 

2、删除用户时不删除他发表的新闻

其实新闻表除了保存用户ID外,我建议还保存用户的名字,多了一点数据冗余,但是在查询新闻时不用外连接用户表,而且在删除新闻时,虽然外键置NULL,但用户名还在,我们还能知道这新闻是谁发布的。

<set name="news"    lazy="true" cascade="save-update" inverse="false">

       <!-- 主键对应的关联表外键 -->

       <key column=" editer_id"></key>

       <!-- 关联表 -->

       <one-to-many class="News"/>

</set>

注意以上的inverser=false

 

3、删除用户时不执行额外操作

只要在<set>中设置 cascade="none"

 转自:http://blog.sina.com.cn/s/blog_5016113a0100lj9y.html

注意

以上情况只是一对多关系,对于多于多等关系还是有些区别的,比如我通过中间表映射的多对多关系,在没有设置cascade的情况下,删除记录时,也会主动删除中间表中的记录,如:

menu映射文件

<set name="roles" lazy="true" table="MenuRole" >

    <!-- 主键对应的中间表的外键 -->

    <key column="menu_id" />

    <many-to-many class="Role" column="role_id"/>

</set>

删除菜单时,会主动从中间表menurole删除记录

 

转自:http://blog.sina.com.cn/s/blog_5016113a0100lj9y.html

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存 ...

    Hibernate+中文文档

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    hibernate3.2中文文档(chm格式)

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    HibernateAPI中文版.chm

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    Hibernate 中文 html 帮助文档

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    最全Hibernate 参考文档

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    Hibernate教程

    20.2.3. 策略:读/写缓存(Strategy: read/write) 20.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 20.2.5. 策略:事务缓存(transactional) 20.3. 管理缓存(Managing the caches) 20.4. ...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate中文详细学习文档

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存 ...

    Hibernate注解

    很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项) * 方法一 * 主表: ?@OneToOne...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存 ...

    精通Hibernate:对象持久化技术第二版part3

    7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象...

    hibernate 教程

    策略:事务缓存(transactional) 14.4. 管理Session缓存 14.5. 查询缓存(Query Cache) 15. 工具箱指南 15.1. Schema 生成器(Schema Generation) 15.1.1. 对schema定制化(Customizing the schema)...

    Hibernate3+中文参考文档

    19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能...

    hibernate总结

    Hibernate级联操作对象的关系属性: 映射文件中设置: 1. Cascade a) none b) Save-update 当使用session的api对当前对象进行save,update操作时,对它的关系属性也进行save或者update c) Delete d) All = delete ...

Global site tag (gtag.js) - Google Analytics