数据库中的表一般都是相互关联的,它们通过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级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...
而在`Hibernate_01_1`的示例代码中,可能展示了如何在Hibernate中配置和使用这些关系,包括如何定义映射、如何处理级联和加载策略等。 总的来说,理解和熟练运用这些概念对于开发基于Hibernate的Java应用非常重要,...
15. **性能优化**: Hibernate 提供了许多性能优化策略,如批处理、延迟加载、缓存策略等,有助于提升应用的运行效率。 在学习和使用Hibernate时,了解并熟练掌握以上知识点至关重要,这将有助于开发出高效、稳定的...
5. **级联操作**:在保存、更新或删除操作时,可以指定是否级联到关联的对象。 6. **事件监听**:通过实现特定接口或使用注解,可以在对象生命周期的不同阶段添加自定义行为。 7. **Native SQL**:允许直接执行SQL...
而级联(Cascading)则是Hibernate中处理关联对象的一种策略,它定义了当一个实体被保存、更新或删除时,与之关联的其他实体应该如何处理。 【描述】: Hibernate中的范型主要体现在SessionFactory、Session、...
### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
5. **缓存策略**: Hibernate提供了二级缓存机制,可以集成第三方缓存提供商如Ehcache,提高应用程序的性能。同时,它还支持查询缓存,将查询结果缓存起来,避免重复执行相同的SQL语句。 6. **实体生命周期**: ...
10. **级联操作**:通过级联属性,可以设置一个实体的修改或删除操作对关联实体的影响,例如级联保存所有子项或级联删除。 11. **集合映射**:Hibernate 支持多种集合类型(如 List、Set、Map)的映射,以及一对一...
12. **级联操作(Cascade)**:设置级联属性可以使数据库操作(如保存、删除)自动影响相关联的对象。 13. **事件监听器**:Hibernate提供了一套事件监听机制,允许在特定的持久化操作前后执行自定义代码。 14. **...
2. **级联操作(Cascading)**: 可以设置关联关系的级联行为,如保存、更新或删除关联对象。 3. **缓存(Caching)**: Hibernate支持二级缓存,提高数据访问速度,如使用Ehcache或Infinispan。 4. **事务管理...
8. **级联操作**:通过在实体类的属性上设置级联注解,可以控制一个对象的保存、删除等操作对关联对象的影响。 9. **懒加载(Lazy Loading)**:Hibernate支持延迟加载,即关联的对象在需要时才从数据库加载,有效...
10. **性能优化**:Hibernate提供了许多性能优化策略,如延迟加载、批处理和结果集映射,帮助开发者提升应用性能。 在《Java Persistence with Hibernate》一书中,读者将深入了解到这些特性的实现和应用,以及如何...
5. **级联操作**:在实体间定义级联关系,如CascadeType.ALL,可以将对一个实体的操作(如保存、删除)自动应用到与之关联的其他实体。 6. **缓存机制**:Hibernate支持第一级缓存(Session缓存)和第二级缓存(可...
4. **级联操作**: 在关联映射中,Hibernate允许级联操作,这意味着对一个实体的操作会影响到与其关联的其他实体。 5. **HQL(Hibernate Query Language)**: Hibernate提供了自己的查询语言HQL,类似于SQL,但面向...
11. **Cascading Operations**:Hibernate支持级联操作,如级联保存、更新、删除,使得对象之间的关系操作更加便捷。 12. **Hibernate Tools**:包括逆向工程、生成数据库脚本、生成实体类等,帮助开发者快速搭建...
2. **数据完整性**:级联删除可能导致意外的数据丢失,因此在使用`CascadeType.DELETE`时需格外小心。 3. **事务管理**:级联操作通常在同一个事务中进行,确保数据一致性。如果不在同一个事务中,可能会引发并发...
8. **级联操作**:在关联映射中,可以设置级联操作,比如在删除父对象时自动删除所有子对象。 9. **多态性支持**:Hibernate支持多态查询,可以在父类上执行查询,返回的结果可能包含不同子类的对象。 10. **...
12. **级联操作**:通过`@Cascade`可以配置级联操作,如在删除父对象时,是否同时删除子对象。 13. ** Hibenate Validator**:Hibernate 还集成了Validator框架,用于校验实体对象的属性值,提供了一套强大的验证...
2. **配置文件**:Hibernate的配置文件(hibernate.cfg.xml)用于定义数据库连接信息、方言、缓存策略等,它是Hibernate启动时的必备配置。 3. **实体类(Entity)**:实体类是与数据库表对应的数据模型,通过@...
13. **Cascading(级联操作)**:级联操作允许一个对象的状态改变影响到其他关联对象,如删除一个父对象时,可以选择级联删除其子对象。 14. **事件监听器**:Hibernate提供事件监听机制,允许在特定操作(如保存、...