按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了。

我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以说:

对于富豪家人来说:一个人可以拥有很多住址Address;对于房子来说:一套房子可以让很多人住。

1、多对多单向关联映射:

Po对象:Person.Java:

  1. public class Person
  2. {
  3. private int id;
  4. private String name;
  5. private Set<Address> address;
  6. //getter\setter
  7. }

Address.java

  1. public class Address
  2. {
  3. private int id;
  4. private String name;
  5. }

映射文件:Person.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test">
  2. <class name="com.ssh.hibernate.Person" table="t_person">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <set name="addres" table="t_personAddress">
  7. <key column="personid"/>
  8. <many-to-many column="addressId" class="com.ssh.hibernate.Address"/>
  9. </set>
  10. </class>
  11. </hibernate-mapping>

Address.hbm.xml:

  1. <hibernate-mapping package="org.hibernate.test">
  2. <class name="com.ssh.hibernate.Address" table="t_address">
  3. <id name="id">
  4. <generator class="native" />
  5. </id>
  6. <property name="name" />
  7. </class>
  8. </hibernate-mapping>

运行程序,生成表语句:

  1. create table Person ( id bigint not null, name varchar(255), primary key(id) )
  2. create table PersonAddress ( personid bigint not null, addressid bigint not null, primary key (personid, addressid) )
  3. create table Address ( id bigint not null,name varchar(255), primary key(id) )

测试:

  1. session.beginTransaction();
  2. Address address1=new Address();
  3. address1.setName("<span margin: 0px; padding: 0px; border: currentColor; color: black; background-color: inherit;">font-family: Arial, Helvetica, sans-serif;">唐人街5号</span>");
  4. session.save(address1);
  5. Address address2=new Address();
  6. address2.setName("北京帽儿胡同12号");
  7. session.save(address2);
  8. Address address3=new Address();
  9. address3.setName("南京花雨石大街10号");
  10. session.save(course3);
  11. Address address4=new Address();
  12. address4.setName("长安大街11号");
  13. session.save(address4);
  14. Person person1=new Person();
  15. Set addres1=new HashSet();
  16. addres1.add(address1);
  17. addres1.add(address2);
  18. person1.setAddresss(addres1);
  19. person1.setName("赵钱孙");
  20. session.save(person1);
  21. Person person2=new Person();
  22. Set addres2=new HashSet();
  23. addres2.add(address2);
  24. addres2.add(address4);
  25. person2.setAddresss(addres2);
  26. person2.setName("甲乙丙");
  27. session.save(person2);
  28. session.getTransaction().commit();

执行完成后,进行查询测试:

  1. session.beginTransaction();
  2. Person person=(Person)session.load(person.class, 1);
  3. System.out.println(person.getName());
  4. for(Address s:person.getaddres()){
  5. System.out.println(s.getName());
  6. }
  7. session.getTransaction().commit();

执行查询结果:

  1. 赵钱孙
  2. 唐人街5号
  3. 北京帽儿胡同12号

2、多对多双向关联映射:

Po对象:Person.java:

  1. public class Person
  2. {
  3. private int id;
  4. private String name;
  5. private Set<Address> address;
  6. //getter\setter
  7. }

Address.java

  1. public class Address
  2. {
  3. private int id;
  4. private String name;
  5. private Set<Person> person;
  6. }

配置文件:Person.hbm.xml

  1. <class name="com.ssh.hibernate.Person" talbe="t_person">
  2. <id name="id" column="id">
  3. <generator class="native"/>
  4. </id>
  5. <set name="addres"  table="t_personAddress">
  6. <key column="personId"/>
  7. <many-to-many column="addressId" class="com.ssh.hibernate.Address"/>
  8. </set>
  9. </class>

Address.hbm.xml

  1. <class name="com.ssh.hibernate.Address" table="t_address">
  2. <id name="id" column="id">
  3. <generator class="native"/>
  4. </id>
  5. <set name="people" inverse="true" table="t_personAddress">
  6. <key column="addressId"/>
  7. <many-to-many column="personId" class="com.ssh.hibernate.Person"/>
  8. </set>
  9. </class>

这就是双向的了,通过住户可以知道他的所有房产,也可以通过房产知道它的所有的住户。其中值得一说的是<set>的<inverse="true">,还记得咱们的IOC容器的全称吗?Inverse Of Control,控制反转,这里指的也是反转,在多对多关联中,如果设置了inverse="true"就表示本方不进行关联的维护,由另一方进行关联的维护。就那上面实力来说,因为设置了<inverse="true">,所以即使执行:

  1. Set<Address> adres=new HashSet<Address>();
  2. adres.add(new Address("北京胡同"));
  3. adres.add(new Address("南京胡同"));
  4. person.setAdres(adres);
  5. session.save(person);

也只会想t_person表中插入数据,而不会向t_personAddress表中插入数据,如果想要同时插入数据,只需要将inserve设置为false;在多对多双向关联映射中,任何一方设置inserve=true都可以,没有特殊限定,因为两方都一样。

【Hibernate框架】关联映射(多对多关联映射)的更多相关文章

  1. Hibernate框架之双向多对多关系映射

    昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...

  2. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

  10. Hibernate一对多自关联、多对多关联

    今天分享hibernate框架的两个关联关系    多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不 ...

随机推荐

  1. Java并发之CountDownLatch

    CountDownLatch是Java concurrent包下的一个同步工具.它可以让一个(或多个)线程等待,直到其他线程中的某些操作完成. 本质上是一个信号量,我们把它比作一个有N个插销的大门,它 ...

  2. linux下安装postgresql

    环境:Linux localhost.localdomain 2.6.32-431 GNU/Linux x86_64 Postgresql版本:postgresql.9.5.3 添加开启自启设置:ht ...

  3. iptables过滤设置服务端口

    1.为SSH跟换连接端口 修改SSH配置文件:/etc/ssh/sshd_config #找到Port 22,这里是标识默认使用22端口,修改为想要的端口. Port Port 2.查看iptable ...

  4. 计算机维修之操作系统的安装(windows、Mac、Linux)

    从大学开始接触了更多的计算机知识,我就在开荒一样,慢慢的接触多了,就想着安装操作系统一定要学会. 前前后后呢,我折腾过很多操作系统,在我的笔记本上存在过Windows.黑苹果.Linux.安卓等操作系 ...

  5. 创建dll教程

    先看我的总结: 总结: 1.头文件中如果想以C形式提供,要判断,如果定义了 _cplusplus, extern "c"{  这里写接口声明 } 2.接口声明中,要表明接口接入点的 ...

  6. Android中锁定文件的方法

    androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...

  7. struts-spring-mybatis实现最简单的登录验证

    1.导入项目相关的jar包 2.建立项目结构 3.配置文件的配置及代码 db.properties: jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:my ...

  8. dell md3200i mdss (企业管理) 安装的那点事儿

    首先获取安装包,解压后如图: 我是在windows 机上安装,所以执行windows 文件夹下的可执行程序: 双击红箭头文件,进行安装,步骤截图如下: 出现最后这个界面,就说明安装成功,直接重启系统就 ...

  9. Unity 好坑的Save Scene

    在编辑一个Untiy工程的时候,有很多的教程提到了 "Save Scene",也知道是干么用的.但是,后面打开工程的时候,工程界面是很多东西都不见了,又忘了有个Save Scene ...

  10. 《转载》Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

    引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...