平时工作中虽然也经常提到多对多的映射,但是在实际操作中运用到还是第一次.
组group和角色role,多对多的映射.
role的映射文件
<hibernate-mapping>
<class name="com.vtradex.thorn.server.model.security.Role" table="ROLES">
<id name="id" column="ID" type="long">
<generator class="native">
<param name="sequence">role_sequence</param>
<param name="parameters">START WITH 1000</param>
</generator>
</id>
<property name="code" type="string">
<column name="CODE" not-null="true" length="50" unique-key="UK_ROLES"/>
</property>
<property name="name" type="string">
<column name="NAME" not-null="true" length="100"/>
</property>
<set name="groups" table="GROUP_ROLE" lazy="true" cascade="all-delete-orphan">
<key column="ROLE_ID"/>
<many-to-many class="com.vtradex.thorn.server.model.security.Group" column="GROUP_ID"/>
</set>
</class>
</hibernate-mapping>
group的映射文件:
<hibernate-mapping>
<class name="com.vtradex.thorn.server.model.security.Group" table="GROUPS">
<id name="id" column="ID" type="long">
<generator class="native">
<param name="sequence">group_sequence</param>
<param name="parameters">START WITH 1000</param>
</generator>
</id>
<property name="code" type="string">
<column name="CODE" not-null="true" length="50" unique-key="UK_GROUP"/>
</property>
<property name="name" type="string">
<column name="NAME" not-null="true" length="100"/>
</property>
<set name="roles" table="GROUP_ROLE" lazy="true" cascade="all-delete-orphan">
<key column="GROUP_ID"/>
<many-to-many class="com.vtradex.thorn.server.model.security.Role" column="ROLE_ID"/>
</set>
<set name="users" table="GROUP_USER" lazy="true">
<key column="GROUP_ID"/>
<many-to-many class="com.vtradex.thorn.server.model.security.User" column="USER_ID"/>
</set>
</class>
</hibernate-mapping>
页面支持双向操作,即可在角色中添加删除组,也可在组中添加删除角色.
在组中添加角色:
public void addGroupRoles(Long groupId, List<Long> roleIds) {
Group group = this.commonDao.load(Group.class, groupId);
List<Role> roles = new ArrayList<Role>();
for(Long roleId : roleIds){
roles.add(this.commonDao.load(Role.class, roleId));
}
group.getRoles().addAll(roles);
this.commonDao.store(group);
}
组内删除角色:
public void removeGroupRoles(Long groupId, List<Long> roleIds) {
Group group = this.commonDao.load(Group.class, groupId);
List<Role> roles = new ArrayList<Role>();
for(Long roleId : roleIds){
roles.add(this.commonDao.load(Role.class, roleId));
}
group.getRoles().removeAll(roles);
this.commonDao.store(group);
}
执行以上操作后,程序在移除组的角色的时候,同时将角色以及组本身都删除掉了.
如果将映射文件改为:
<set name="groups" table="GROUP_ROLE" lazy="true" cascade="delete">
<key column="ROLE_ID"/>
<many-to-many class="com.vtradex.thorn.server.model.security.Group" column="GROUP_ID"/>
</set>
以及
<set name="roles" table="GROUP_ROLE" lazy="true" cascade="delete">
<key column="GROUP_ID"/>
<many-to-many class="com.vtradex.thorn.server.model.security.Role" column="ROLE_ID"/>
</set>
以上配置下,可以正常进行相关的添加删除操作.直接将cascade="delete"去掉,同样可以正常操作.
觉得很纳闷,程序中只是将角色从组中移除,而不是删除角色这个对象.操作过程中应该是将中间表group_role中的记录删除,但是最后却连带把group和role的记录也删除了.
和同事讨论这种现象,同事分析说hibernate在all-delete-orphan情况下,在删除中间表的时候,会判断相关联的对象是否是"孤儿",如果是"孤儿"也会将相关的对象同时删除.
分享到:
- 2007-02-12 16:14
- 浏览 3266
- 评论(1)
- 论坛回复 / 浏览 (1 / 5766)
- 查看更多
相关推荐
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
在Java的持久化框架Hibernate中,多对多(Many-to-Many)映射是一种常见的关系数据库模型,用于处理两个实体之间复杂的关系。本实例将详细阐述如何在Hibernate中实现多对多映射,并通过源代码和测试程序进行实战演示...
在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...
本篇主要探讨的是Hibernate中的多对多映射,这是一个复杂但常见的数据库关系,适用于那些实体之间存在多个关联的情况。 一、Hibernate多对多映射基础 多对多映射在数据库中表现为两个表通过一个中间表(或称为连接...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
本项目聚焦于Hibernate中的多对多关系映射,这是一种复杂但常见的数据库关联类型,适用于如用户角色、商品类别等场景。 **一、多对多关系** 在数据库设计中,多对多关系表示两个实体之间存在多个匹配的可能性。...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
**标题:“Hibernate多对多映射实战”** 在Java领域,ORM(对象关系映射)框架如Hibernate极大地简化了数据库操作。本示例主要聚焦于使用Hibernate处理数据库中的多对多关系,这是一种复杂但常见的关联类型。在关系...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...
本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...
在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...
本教程将详细讲解如何使用Hibernate来实现MySQL数据库中的一对多和多对一的映射关系。 ### 一、Hibernate简介 Hibernate是一个开源的ORM框架,它通过XML配置文件或者注解将Java对象映射到关系数据库表,实现了对象...
"自动生成 Hibernate 映射文件和实体类" 自动生成 Hibernate 映射文件和实体类是使用 MyEclipse 工具来实现的,这可以大大提高开发效率,减少开发时间。下面将详细介绍如何使用 MyEclipse 自动生成 Hibernate 映射...
在Java的持久化框架Hibernate中,多对一(Many-to-One)映射是一种常见的关联关系。这种关系表示在一个实体类中可以引用另一个实体类的多个实例,而在被引用的实体类中,每个实例只被一个引用实体类实例引用。本文将...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
在Java的持久化框架Hibernate中,单向多对多映射是一种常见的关系映射方式,尤其在处理数据库中两个实体间复杂关联时显得尤为重要。在注解版的Hibernate中,我们不再需要传统的XML配置文件,而是直接在实体类上使用...
本篇文章将深入探讨“Hibernate多对一映射”这一关键概念,并通过实例来阐述其工作原理。 ### 一、多对一映射概述 在数据库设计中,多对一关联意味着一个实体(表)可以与另一个实体(表)中的多个记录相关联,而...