两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系。比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以授予多个用户。

在持久化对象设计的时候,角色和用户都分别有一个集合来防止拥有它的用户或角色。角色类的设计:

public class RolePO {
 private int id;
 
 private String name;
 
 private Set employees = new HashSet();

......

}

用户类的设计:

public class EmployeePO {
 private int id;

private String name;

private Set roles = new HashSet();

......

}

映射对象关系映射文件配置如下:

RolePO.hbm.xml:

<hibernate-mapping>
 <class name="com.lovo.po.RolePO" table="t_role">
  <id name="id" column="r_id" type="int">
   <generator class="increment"></generator>
  </id>
  <property name="name" column="f_name" type="string"></property>
  <set name="employees" table="mapping" cascade="all" inverse="false">
   <key column="f_r_id"></key>
   <many-to-many class="com.lovo.po.EmployeePO" column="f__e_id"/>
  </set>
 </class>
</hibernate-mapping>

EmployeePO.hbm.xml:

<hibernate-mapping>
 <class name="com.lovo.po.EmployeePO" table="t_employee">
  <id name="id" column="e_id" type="int">
   <generator class="increment"></generator>
  </id>
  <property name="name" column="f_name" type="string"></property>
  <set name="roles" table="mapping" cascade="all" inverse="true">
   <key column="f_e_id"></key>
   <many-to-many class="com.lovo.po.RolePO" column="f_r_id"/>
  </set>
 </class>
</hibernate-mapping>
需要注意的是<key>中的column对应的是当前类在中间表中对应的字段,即对方想要的外键,而<many-to-many class="com.lovo.po.RolePO" column="f_roleid"/>中的column指示的是中间表中本类想要的外键。还要注意的是inverse的值只能有一个为true,因为如果双发都为true,那么双发都去维护关系,会造成中间关系表中出现重复的数据。在进行删除的时候Hibernate会删除id所对应的信息和中间关系表中对应的信息,如,删除用户

如:Hibernate: delete from mapping where f_e_id=?
Hibernate: delete from employee where e_id=?

Hibernate多对多关系映射的更多相关文章

  1. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  2. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  3. Hibernate学习笔记(五) — 多对多关系映射

    多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...

  4. Hibernate自身一对多和多对多关系映射

    一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别 ...

  5. Hibernate学习第三天(2)(多对多关系映射)

    1.1.1      Hibernate多对多关系的配置 1.1.1.1   创建表 l   用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...

  6. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  7. Hibernate学习之关系映射(转)

    一.一对多 "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系.一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多.多对一:从订单的角度来说多个订单可以对应一 ...

  8. 菜鸟学习Hibernate——一对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...

  9. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

随机推荐

  1. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

    问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...

  2. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  3. iOS UITextView 输入内容实时更新cell的高度

    iOS UITextView 输入内容实时更新cell的高度 2014-12-26 11:37 编辑: suiling 分类:iOS开发 来源:Vito Zhang'blog  11 4741 UIT ...

  4. ubuntu/debian gpg error no_pubkey 解决方法

    GPG error: http://ppa.launchpad.net precise Release: The following signatures couldn’t be verified b ...

  5. Json对象与Json字符串的转化

    1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2.浏览器支持的转 ...

  6. OVN实战---《An Introduction to OVN Routing》翻译

    Overview 在前面一篇文章的基础上,现在我将通过OVN创建一个基础的三层网络.创建的最终结果将是一对logical switches通过一个logical router相连.另外,该路由器会通过 ...

  7. openwrt undefined reference to ‘getpwent_r’

    由于须要安装 su sudo useradd groupadd chown login 等用户管理命令,会訪问passwd文件. 用到了 getpwant_r 函数.详细是哪个命令引起的,临时不知. ...

  8. Codeforce 475 C. Kamal-ol-molk&#39;s Painting

    从最左上的点開始枚举长宽.... C. Kamal-ol-molk's Painting time limit per test 2 seconds memory limit per test 256 ...

  9. 学习笔记のsendRedirect &forward

    尽管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很 ...

  10. java 多线程 day05 线程范围内的数据共享

    import java.util.HashMap;import java.util.Map;import java.util.Random;/** * Created by chengtao on 1 ...