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

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

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. CocoaPods安装和使用教程Code4App LOGO

    本文转载至 http://code4app.com/article/cocoapods-install-usage Code4App 原创文章.转载请注明出处:http://code4app.com/ ...

  2. Wex5循环某个div节点下的所有img标签,替换其src属性值

    Model.prototype.newsDetailAfterRefresh = function(event){ var newsDiv = this.getElementByXid("n ...

  3. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  4. C# WinForm 中进行UrlEncode

    public static string ToUrlEncode(string strCode) { StringBuilder sb = new StringBuilder(); byte[] by ...

  5. Spring - Netty (整合)

      写在前面  ​ 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客圈].正在开始 高并发.亿级流程的 IM 聊天程序 学习和实战,此文是:   疯狂创客圈 Java ...

  6. win64系统丢失d3dx9d_40.dll问题

    在Win64系统中,安装了DXSDK.DX9,却一直显示如上对话框,导致程序运行不起来. 于是我在网上找到了一个d3dx9d_40.dll,覆盖到C:\Windows\System32中,但是问题依然 ...

  7. python多线程的两种写法

    1.一般多线程 import threading def func(arg): # 获取当前执行该函数的线程的对象 t = threading.current_thread() # 根据当前线程对象获 ...

  8. 快速入门Python中文件读写IO是如何来操作外部数据的?

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  9. 使用 10046 查看执行计划并读懂 trace 文件

    查看 sql 执行计划的方法有许多种, 10046 事件就是其中的一种. 与其他查看 sql 执行计划不同, 当我们遇到比较复杂的 sql 语句, 我们可以通过 10046 跟踪 sql 得到执行计划 ...

  10. 使用哈工大LTP进行句法分析

    作者注:本教程旨在对哈工大LTP在github上的LTP4J(LTP的java版本)教程的补充,请结合以下参考网站一起食用. 参考网站: [1]哈工大语言技术平台云官网--LTP使用文档 http:/ ...