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

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

对于富豪家人来说:一个人可以拥有很多住址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. Python之路【第二十三篇】爬虫

    difference between urllib and urllib2 自己翻译的装逼必备 What is the difference between urllib and urllib2 mo ...

  2. SpringMVC学习记录2

    废话 最近在看SpringMVC...里面东西好多...反正东看一点西看一点吧... 分享一下最近的一些心得..是关于DispatcherServlet的 DispatcherServlet与Cont ...

  3. nginx 反代理google

    ./configure \ --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/n ...

  4. Mac 操作技巧

    1.OS X下如何在同一个程序之中快速切换窗口 command+`(1左边的那个) 2.

  5. windows安装redis

    下载安装包,由于redis不提供windows版本,但是通过官网了解,如下: The Redis project does not officially support Windows. Howeve ...

  6. Hibernate之lazy延迟加载

    一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...

  7. [Python] from scipy import sparse 报 DLL load failed:找不到指定模块错误

    依赖vc运行环境.需要安装 vc_redist Py3.5要安装2015版 传送门: https://www.microsoft.com/zh-CN/download/details.aspx?id= ...

  8. react+redux官方实例TODO从最简单的入门(2)-- 增

    虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那 ...

  9. 创建table并实现ID自增长

    ① create table p_user( id               number(10) not null primary key, name             varchar2(3 ...

  10. 使用Dir,遍历文件夹下所有子文件夹及文件

    '------------------------------------------- '获取某文件夹下所有文件和子目录下的文件 '--------------------------------- ...