`
cuishen
  • 浏览: 297994 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate多对多级联删除总结

    博客分类:
  • j2ee
阅读更多
A. 应用场景:

一个简单的权限系统的例子:

有三张主表:
用户表:t_user
角色表:role
菜单表:menu

有两张关系表:
用户角色关系表:UserRoleMap
角色菜单关系表:RoleMenuMap

role表和t_user表,及role表和menu表通过两张关系表进行多对多关联。

目标是:当删除某个角色的时候,级联删除两张关系表中对应的关系记录

B. 下面是hibernate的实现:

UserRoleMap.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.cuishen.edwview.pojo.sys.UserRoleMap" table="userrolemap" catalog="edwindex">
        <composite-id>
            <key-property name="userId" type="java.lang.Long">
                <column name="userid" />
            </key-property>
            <key-property name="roleId" type="java.lang.Long">
                <column name="roleid" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>


RoleMenuMap.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.cuishen.edwview.pojo.sys.RoleMenuMap" table="rolemenumap">
<composite-id>
<key-property name="roleId" column="roleid" type="java.lang.Long"/>    
<key-property name="menuId" column="menuid" type="java.lang.Long"/>
</composite-id>
</class>
</hibernate-mapping>


Role.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.cuishen.edwview.pojo.sys.Role" table="role" catalog="edwindex">
	<id name="id" type="java.lang.Long" column="id">
		<generator class="sequence">
			<param name="sequence">ROLE_SEQ</param>
		</generator>
	</id>
	<property name="name" type="string">
		<column name="name" length="20" not-null="true" />
	</property>
	<set name="menus" table="RoleMenuMap" inverse="false" lazy="false" order-by="roleId, menuId">
		<key column="roleId"/>
		<many-to-many column="menuId" class="com.cuishen.edwview.pojo.sys.Menu"/>
	</set>
	<set name="users" table="UserRoleMap" inverse="false" lazy="false">
		<key column="roleId"/>
		<many-to-many column="userId" class="com.cuishen.edwview.pojo.sys.User"/>
	</set>
    </class>
</hibernate-mapping>


注意上面Role.hbm.xml中的inverse="false",加上这句配置后,在delete(role);的时候hibernate会自动维护关系表,将已不存在的对应关系删除,如果想在删除关系的同时也删除对应的User或者Menu,就需要再加上cascade="delete"项配置。

当然可以在DDL建表时加入外键级联更新的定义,这样就全权交由数据库来级联删除,就不需要hibernate再操心了!
分享到:
评论
2 楼 diaoweili 2010-11-18  
cuishen 写道
A. 应用场景:

一个简单的权限系统的例子:

有三张主表:
用户表:t_user
角色表:role
菜单表:menu

有两张关系表:
用户角色关系表:UserRoleMap
角色菜单关系表:RoleMenuMap

role表和t_user表,及role表和menu表通过两张关系表进行多对多关联。

目标是:当删除某个角色的时候,级联删除两张关系表中对应的关系记录

B. 下面是hibernate的实现:

UserRoleMap.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.cuishen.edwview.pojo.sys.UserRoleMap" table="userrolemap" catalog="edwindex">
        <composite-id>
            <key-property name="userId" type="java.lang.Long">
                <column name="userid" />
            </key-property>
            <key-property name="roleId" type="java.lang.Long">
                <column name="roleid" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>


RoleMenuMap.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.cuishen.edwview.pojo.sys.RoleMenuMap" table="rolemenumap">
<composite-id>
<key-property name="roleId" column="roleid" type="java.lang.Long"/>    
<key-property name="menuId" column="menuid" type="java.lang.Long"/>
</composite-id>
</class>
</hibernate-mapping>


Role.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.cuishen.edwview.pojo.sys.Role" table="role" catalog="edwindex">
	<id name="id" type="java.lang.Long" column="id">
		<generator class="sequence">
			<param name="sequence">ROLE_SEQ</param>
		</generator>
	</id>
	<property name="name" type="string">
		<column name="name" length="20" not-null="true" />
	</property>
	<set name="menus" table="RoleMenuMap" inverse="false" lazy="false" order-by="roleId, menuId">
		<key column="roleId"/>
		<many-to-many column="menuId" class="com.cuishen.edwview.pojo.sys.Menu"/>
	</set>
	<set name="users" table="UserRoleMap" inverse="false" lazy="false">
		<key column="roleId"/>
		<many-to-many column="userId" class="com.cuishen.edwview.pojo.sys.User"/>
	</set>
    </class>
</hibernate-mapping>


注意上面Role.hbm.xml中的inverse="false",加上这句配置后,在delete(role);的时候hibernate会自动维护关系表,将已不存在的对应关系删除,如果想在删除关系的同时也删除对应的User或者Menu,就需要再加上cascade="delete"项配置。

当然可以在DDL建表时加入外键级联更新的定义,这样就全权交由数据库来级联删除,就不需要hibernate再操心了!

1 楼 diaoweili 2010-11-18  
恍然大悟啊~~
你把权限模型说的很清楚,我都把级联维护的事给忘了,
看到cascade="delete" 才回过神来。
辛苦啊!~

相关推荐

    hibernate多对多关联映射

    `org.hibernate.persister.collection.AbstractCollectionPersister`和`org.hibernate.action.internal.CollectionRemoveAction`等类是处理多对多关联删除的关键。通过阅读源码,我们可以了解到Hibernate如何处理...

    Hibernate 一对多、多对一、级联、加载、反转

    在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...

    hibernate 级联(cascade和inverse)一对多

    总结,Hibernate的级联和反转特性对于一对多关系的管理至关重要,它们可以简化开发过程,提高数据操作的效率。通过合理配置,可以确保对象关系的正确同步,并利用JUnit进行测试以确保功能的正确性。在实践中,应根据...

    Hibernate多对多实例+数据库代码

    通过查看代码和运行示例,开发者可以深入理解Hibernate是如何自动处理复杂的关联操作,比如通过中间表实现多对多的添加、删除和查找。 **总结** 这个"Hibernate多对多实例+数据库代码"涵盖了ORM的核心概念,特别是...

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。...希望本文能对你理解Hibernate的多表联合查询有所帮助。

    Hibernate-基础联表模板

    "Hibernate-基础联表模板"是针对Hibernate中联表查询的一个实用工具,旨在帮助开发者快速地进行多表关联查询,而不必记住复杂的SQL语句。 1. **Hibernate简介** Hibernate是一种开源的ORM框架,它允许开发者将Java...

    Hibernate多对多关联添加及查询示例

    本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...

    hibernate(一对多,多对一映射)操作

    本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...

    hibernate多对多

    总结来说,"Hibernate多对多"涉及到Java ORM框架Hibernate处理两个实体类之间的多对多关系的技术,在MyEclipse环境下进行开发,提供了从设计实体类、配置映射到实现业务逻辑的全套解决方案。通过提供的压缩包文件,...

    hibernate 映射关系学习入门 多对多实体映射

    在实际应用中,我们可以通过Hibernate提供的API来添加、删除和查找多对多关系。例如,向`Student`添加一门`Course`,可以使用`addCourse(Course course)`方法;删除则通过`removeCourse(Course course)`方法。 六、...

    hibernate 一对多,两个实例项目

    总结,"hibernate 一对多,两个实例项目"旨在帮助开发者深入理解Hibernate中的一对多关系映射,并通过实际项目实践来提升技能。通过这两个实例,我们可以学习到如何配置、操作以及优化一对多关系,从而在实际开发中...

    struts+spring+hibernate实现图书修改和删除

    在这个项目中,Struts 2被用来处理用户对图书修改和删除的请求,通过Action类定义业务逻辑,并返回相应的视图结果。 **Spring** Spring是Java企业级应用的核心框架,提供依赖注入(DI)和面向切面编程(AOP)等功能...

    Hibernate多对多

    **标题:“Hibernate多对多”** 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式处理数据库操作。在关系数据库中,表与表之间的关系可以是一对一、一对多或多对多。本...

    hibernate 一对多和多对一的理解

    hibernate 一对多和多对一的理解 自己的个人看法 大家也来看看

    hibernate 多对多映射实例,学生 选课

    在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...

    hibernate学习总结文档

    Hibernate 支持多种关联关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。关联关系可以通过外键或代理键实现,配置包括懒加载(lazy loading)和级联操作(cascading...

    Hibernate 简单 PPT 总结

    【Hibernate 简单 PPT 总结】 Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。通过提供一套API和元数据,Hibernate允许开发者将业务对象直接映射到数据库表,从而避免了...

Global site tag (gtag.js) - Google Analytics