【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了。
我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以说:
对于富豪家人来说:一个人可以拥有很多住址Address;对于房子来说:一套房子可以让很多人住。
1、多对多单向关联映射:
Po对象:Person.Java:
- public class Person
- {
- private int id;
- private String name;
- private Set<Address> address;
- //getter\setter
- }
Address.java
- public class Address
- {
- private int id;
- private String name;
- }
映射文件:Person.hbm.xml
- <hibernate-mapping package="org.hibernate.test">
- <class name="com.ssh.hibernate.Person" table="t_person">
- <id name="id">
- <generator class="native"/>
- </id>
- <set name="addres" table="t_personAddress">
- <key column="personid"/>
- <many-to-many column="addressId" class="com.ssh.hibernate.Address"/>
- </set>
- </class>
- </hibernate-mapping>
Address.hbm.xml:
- <hibernate-mapping package="org.hibernate.test">
- <class name="com.ssh.hibernate.Address" table="t_address">
- <id name="id">
- <generator class="native" />
- </id>
- <property name="name" />
- </class>
- </hibernate-mapping>
运行程序,生成表语句:
- create table Person ( id bigint not null, name varchar(255), primary key(id) )
- create table PersonAddress ( personid bigint not null, addressid bigint not null, primary key (personid, addressid) )
- create table Address ( id bigint not null,name varchar(255), primary key(id) )
测试:
- session.beginTransaction();
- Address address1=new Address();
- address1.setName("<span margin: 0px; padding: 0px; border: currentColor; color: black; background-color: inherit;">font-family: Arial, Helvetica, sans-serif;">唐人街5号</span>");
- session.save(address1);
- Address address2=new Address();
- address2.setName("北京帽儿胡同12号");
- session.save(address2);
- Address address3=new Address();
- address3.setName("南京花雨石大街10号");
- session.save(course3);
- Address address4=new Address();
- address4.setName("长安大街11号");
- session.save(address4);
- Person person1=new Person();
- Set addres1=new HashSet();
- addres1.add(address1);
- addres1.add(address2);
- person1.setAddresss(addres1);
- person1.setName("赵钱孙");
- session.save(person1);
- Person person2=new Person();
- Set addres2=new HashSet();
- addres2.add(address2);
- addres2.add(address4);
- person2.setAddresss(addres2);
- person2.setName("甲乙丙");
- session.save(person2);
- session.getTransaction().commit();
执行完成后,进行查询测试:
- session.beginTransaction();
- Person person=(Person)session.load(person.class, 1);
- System.out.println(person.getName());
- for(Address s:person.getaddres()){
- System.out.println(s.getName());
- }
- session.getTransaction().commit();
执行查询结果:
- 赵钱孙
- 唐人街5号
- 北京帽儿胡同12号
2、多对多双向关联映射:
Po对象:Person.java:
- public class Person
- {
- private int id;
- private String name;
- private Set<Address> address;
- //getter\setter
- }
Address.java
- public class Address
- {
- private int id;
- private String name;
- private Set<Person> person;
- }
配置文件:Person.hbm.xml
- <class name="com.ssh.hibernate.Person" talbe="t_person">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <set name="addres" table="t_personAddress">
- <key column="personId"/>
- <many-to-many column="addressId" class="com.ssh.hibernate.Address"/>
- </set>
- </class>
Address.hbm.xml
- <class name="com.ssh.hibernate.Address" table="t_address">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
- <set name="people" inverse="true" table="t_personAddress">
- <key column="addressId"/>
- <many-to-many column="personId" class="com.ssh.hibernate.Person"/>
- </set>
- </class>
这就是双向的了,通过住户可以知道他的所有房产,也可以通过房产知道它的所有的住户。其中值得一说的是<set>的<inverse="true">,还记得咱们的IOC容器的全称吗?Inverse Of Control,控制反转,这里指的也是反转,在多对多关联中,如果设置了inverse="true"就表示本方不进行关联的维护,由另一方进行关联的维护。就那上面实力来说,因为设置了<inverse="true">,所以即使执行:
- Set<Address> adres=new HashSet<Address>();
- adres.add(new Address("北京胡同"));
- adres.add(new Address("南京胡同"));
- person.setAdres(adres);
- session.save(person);
也只会想t_person表中插入数据,而不会向t_personAddress表中插入数据,如果想要同时插入数据,只需要将inserve设置为false;在多对多双向关联映射中,任何一方设置inserve=true都可以,没有特殊限定,因为两方都一样。
【Hibernate框架】关联映射(多对多关联映射)的更多相关文章
- Hibernate框架之双向多对多关系映射
昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...
- 一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)
上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...
- java之hibernate之单向的多对多关联映射
这篇 单向的多对多关联映射 1.如何在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Permission.java public class Permission impl ...
- java之hibernate之双向的多对一关联映射
这篇讲解 双向的多对一关联映射 1.表结构和多对一时,一致 2.类结构 Book.java public class Book implements Serializable{ private int ...
- Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
- Hibernate一对多自关联、多对多关联
今天分享hibernate框架的两个关联关系 多对多关系注意事项 一定要定义一个主控方 多对多删除 主控方直接删除 被控方先通过主控方解除多对多关系,再删除被控方 禁用级联删除 关联关系编辑,不 ...
随机推荐
- Yii2 assets注册的css样式文件没有加载
准备引入layui.css文件的,在LayuiAssets类中已经配置了资源属性 <?php namespace frontend\assets; use yii\web\AssetBundle ...
- doT.js
最近用到的数据模板引擎有很多,今天讲的doT.js也是其中一种. doT.js的特点是体积小,速度快,并且不依赖其他插件. 官网下载:http://olado.github.io 下面是用法: 模板引 ...
- 小白 安装和配置Tomcat 局域网内访问网页
1.官网http://tomcat.apache.org/ ,下载tomcat,解压就好 2.官网www.oracle.com, 下载javaJDK,截图如下,点击黄色荧光笔
- maven 配置问题
① 错误 Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver' 原因:pom.xml文件下载ojdbc14-10.2.0.3. ...
- [CodeWars][JS]实现链式加法
在知乎上看到这样一个问题:http://www.zhihu.com/question/31805304; 简单地说就是实现这样一个add函数: add(x1)(x2)(x3)...(xn) == x1 ...
- ListView加载性能优化---ViewHolder---分页
ListView是Android中一个重要的组件,可以使用它加列表数据,用户可以自己定义列表数据,同时ListView的数据加载要借助Adapter,一般情况下要在Adapter类中重写getCoun ...
- c语言内存原理
1.内存寻址由大到小,优先分配内存地址比较大得字节给变量 2.变量越先定义,内存地址就越大 3.取得变量的地址:&变量名 4.输出地址 %p
- 面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)
面向过程:典型的是C/C++的结构体,结构体里只有变量,没有处理变量的方法,需要专门编写处理变量的方法. 面向对象:ArrayList<Integer> list=new ArrayLis ...
- win10 安装framework3.5
win+x 点击命令提示符(个管理员) 输入dism.exe /online /enable-feature /featurename:NetFX3 /Source:H:\sources\sxs(解压 ...
- Java常用的技术网站
学习Java,我会去的网站: 1.开源项目网站:https://github.com/和http://www.codeproject.com/,可以在这里搜索到别人上传的一些代码和项目 2.咨询问题的 ...