多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。

映射原理

不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。

举例

一个用户(User)对多个角色(Role),一个角色对多个用户。

分类

单向的多对多关联映射(单向User--->Role)

对象模型

关系模型

实例

下面我们看一下实体类和映射文件的代码。

User

  1. package com.liang.hibernate;
  2. import java.util.Set;
  3. public class User {
  4. private int id;
  5. private String name;
  6. private Set roles;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public Set getRoles() {
  14. return roles;
  15. }
  16. public void setRoles(Set roles) {
  17. this.roles = roles;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. }

Role

  1. package com.liang.hibernate;
  2. public class Role {
  3. private int id;
  4. private String name;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. }

User.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.liang.hibernate">
  6. <class name="User" table="t_user">
  7. <id name="id">
  8. <generator class="native"></generator>
  9. </id>
  10. <property name="name"></property>
  11. <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->
  12. <set name="roles" table="t_user_role">
  13. <!--当前表(User)的主键-->
  14. <key column="user_id"></key>
  15. <many-to-many class="Role" column="role_id"></many-to-many>
  16. </set>
  17. </class>
  18. </hibernate-mapping>

Role.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.liang.hibernate">
  6. <class name="Role" table="t_role">
  7. <id name="id">
  8. <generator class="native"></generator>
  9. </id>
  10. <property name="name"></property>
  11. </class>
  12. </hibernate-mapping>

生成的表结构和测试数据

多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。

双向的多对多关联映射(双向User<--->Role)

对象模型

关系模型

同上

实例

下面我们看一下实体类和映射文件的代码。

User

  1. package com.liang.hibernate;
  2. import java.util.Set;
  3. public class User {
  4. private int id;
  5. private String name;
  6. private Set roles;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public Set getRoles() {
  14. return roles;
  15. }
  16. public void setRoles(Set roles) {
  17. this.roles = roles;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. }

Role

  1. package com.liang.hibernate;
  2. import java.util.Set;
  3. public class Role {
  4. private int id;
  5. private String name;
  6. private Set users;
  7. public Set getUsers() {
  8. return users;
  9. }
  10. public void setUsers(Set users) {
  11. this.users = users;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. }

User.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.liang.hibernate">
  6. <class name="User" table="t_user">
  7. <id name="id">
  8. <generator class="native"></generator>
  9. </id>
  10. <property name="name"></property>
  11. <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->
  12. <set name="roles" table="t_user_role">
  13. <!--当前表(User)的主键-->
  14. <key column="user_id"></key>
  15. <many-to-many class="Role" column="role_id"></many-to-many>
  16. </set>
  17. </class>
  18. </hibernate-mapping>

Role.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.liang.hibernate">
  6. <class name="Role" table="t_role">
  7. <id name="id">
  8. <generator class="native"></generator>
  9. </id>
  10. <property name="name"></property>
  11. <!-- users属性,表达的是本对象(Role)与User的多对多的关系 -->
  12. <set name="users" table="t_user_role">
  13. <!--当前表(Role)的主键-->
  14. <key column="role_id"></key>
  15. <many-to-many class="User" column="user_id"></many-to-many>
  16. </set>
  17. </class>
  18. </hibernate-mapping>

生成的表结构和测试数据

多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。

总结

多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。

Hibernate的总结篇马上杀到,谢谢关注。

转:http://blog.csdn.net/jiuqiyuliang/article/details/41015645

(Hibernate进阶)Hibernate映射——多对多关联映射(八)的更多相关文章

  1. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  2. Hibernate(六)——多对多关联映射

    前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...

  3. 一口一口吃掉Hibernate(六)——多对多关联映射

    今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...

  4. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

  5. java之hibernate之单向的多对多关联映射

    这篇 单向的多对多关联映射 1.如何在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Permission.java public class Permission impl ...

  6. java之hibernate之双向的多对一关联映射

    这篇讲解 双向的多对一关联映射 1.表结构和多对一时,一致 2.类结构 Book.java public class Book implements Serializable{ private int ...

  7. hibernate的多对多关联映射

    在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...

  8. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  9. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

随机推荐

  1. php部分---文件上传:错误处理、 客户端和服务器端的限制

    1.客户端页面 <!---客户端的配置 1.表单页面 2.表单发送方式为post 3.表单form中添加enctype="multipart/form-data" ----- ...

  2. python中的input,print

    此用例在python3.3.5中测试通过: 输入:在python中输入是使用input,下面示例代码表示把输入的值存入变量s中,并输入s 在这里提醒一下:使用input获取的值都是string类型

  3. 在chrome 总调试cordova出现Detached from the target. Remote debugging has been terminated with reason: Connection lost. Please re-attach to the new target

    在chrome 总调试cordova出现如下错误: "Detached from the target. Remote debugging has been terminated with ...

  4. linux KERNEL 问题

    http://stackoverflow.com/questions/9305992/linux-threads-and-process 深入 Linux 的进程优先级(vruntime) https ...

  5. apk安全测试思路

    一: apk安全测试 对于一款android的apk程序,主要进行的测试分两部分: 1) 接口测试 ---接口测试实际上是常见的web安全测试 2) android组件测试 --组件测试实际上是and ...

  6. 【android】Android am命令使用

    一.开启Activity.服务.广播 1.开启Activity.服务.广播基础知识 通过adb shell,可以使用activity manager(arm)工具来执行不同的系统操作,如开启一个act ...

  7. 【python】用setup安装自定义模块和包

    python解释器查找module进行加载的时候,查找的目录是存放在sys.path变量中的,sys.path变量中包含文件的当前目录.如果你想使用一个存放在其他目录的脚本,或者是其他系统的脚本,你可 ...

  8. C#:生成短网址

    /// <summary> /// 短网址应用 ,例如QQ微博的url.cn http://url.cn/2hytQx /// </summary> /// <param ...

  9. 【原】灵活运用sessionStorage或者localStorage

    有时,一个app中,后台并没有提供页面中对应的信息接口,需要前端在页面跳转时把某些信息带入下一个页面,一般想到用url后带参数的方法,但是有时需要带的参数过长,就不适合用这个方法了,所以用sessio ...

  10. 查询01_DML锁和DDL锁的处理

    一.摘要 Oracle的手册上关于锁的分类说明如下: 1. DML锁:Date lock.执行DML时保护数据的锁.Row Lock(TX)保护特定行,Table Lock(TM)保护整个表,可以通过 ...