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

映射原理

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

举例

一个用户(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. quartz(1)

    关于定时任务的操作方法,java语言本身具有 Timer 来解决,但Timer 作用起来不是特别的舒服,由于项目的需要,使用了Quartz 这个调度框架,现把学习过程记录下来,方便以后查阅. 本教程是 ...

  2. maven clean deploy -Pproduction

    今天我修改了公司的组件,要发布.然后腾飞告诉我用这个命令:clean deploy -Pproduction发布. 然后报了个401错误.(当时还是不知道401是什么错)正好经理在旁边问了一下,没想到 ...

  3. 为什么有禁用Mac系统的Spotlight的需求:

    一.为什么有禁用Mac系统的Spotlight的需求: 有的网友由于使用的是相对较老的苹果电脑在运行较新的系统:也有可能你是个速度控,受不了偶尔卡卡顿顿的操作,必须将所有导致卡顿的原因全部消除:也有可 ...

  4. javascript知识点之DOM与window对象

    在学习javascript过程中只是一知半解好多,碰到自己不知道属性方法,到最后都不知道自己学到了什么 js代码为什么这样写 为什么你知道这方法或属性可以这样用. DOM和window对象 DOM基本 ...

  5. 高级Linux SA需要会做的事情

    高级Linux SA需要会做的事情:linux---------系统安装(光盘或自动化安装)linux---------系统常用工具安装(sudo,ntp,yum,rsync,lrzsz syssta ...

  6. window.onload与$(document).ready()区别

    2013-12-08 17:11:34 window.onload一次只能执行一个程序,而$(document).ready()可以按照先后顺序执行多个程序. eg: function one(){ ...

  7. connections

    recv(), recvfrom() http://lxr.free-electrons.com/source/net/socket.c http://grepcode.com/file/reposi ...

  8. 数据库设计与 ER 模型 - 数据库系统原理

    数据库系统生存周期 数据库应用系统的开发是一项软件工程,一般具有信息的采集.组织.加工.抽取.综合.传播等功能,但又有自己的特点,所以称为 数据库工程. 数据库应用系统从开始规划.设计.实现.维护到最 ...

  9. 获取公网IP

    private static string GetIP() { string tempip = ""; try { WebRequest wr = WebRequest.Creat ...

  10. C(C++)输入输出格式

    c&c++输入输出控制格式 许多情况下,都需要控制输出结果的表现形式.如输出宽度.输出精度.输出格式等.C++的iomanip.h中定义了许多控制符,这些控制符可以直接插入到流中,控制数据的输 ...