1.n-n 的关联必须使用连接表

与1-n映射类似,必须为set集合元素添加 key 子元素,需要指定中间表

2.实体类

Category.java

  1. public class Category {
  2. private Integer id;
  3. private String name;
  4. private Set<Item> item = new HashSet<>();
  5. //忽略getter和setter 方法
  6. ...
  7. }

Item.java

  1. public class Item {
  2. private Integer id;
  3. private String name;
  4. //忽略getter和setter
  5. ...
  6. }

3.映射文件

Category.hbm.xml

  1. <hibernate-mapping package="com.withXml.manyToMany.entity">
  2. <class name="Category" table="CATEGORY">
  3. <id name="id" type="java.lang.Integer">
  4. <column name="ID" />
  5. <generator class="native" />
  6. </id>
  7. <property name="name" type="java.lang.String">
  8. <column name="NAME" />
  9. </property>
  10. <!-- table:中间表 column:Category持久化类在中间表的外键-->
  11. <set name="item" table="CATEGORY_ITEM">
  12. <key>
  13. <column name="C_ID" />
  14. </key>
  15. <!-- 使用many-to-many指定多对多的关联关系,column:指定Set集合中的持久化类在中间表的外键列的名称,即Item持久化类在中间表的外键 -->
  16. <many-to-many class="Item" column="I_ID"></many-to-many>
  17. </set>
  18. </class>
  19. </hibernate-mapping>

Item.hbm.xml

  1. <hibernate-mapping package="com.withXml.manyToMany.entity">
  2. <class name="Item" table="ITEM">
  3. <id name="id" type="java.lang.Integer">
  4. <column name="ID" />
  5. <generator class="native" />
  6. </id>
  7. <property name="name" type="java.lang.String">
  8. <column name="NAME" />
  9. </property>
  10. </class>
  11. </hibernate-mapping>

4.CRUD测试

①添加

  1. /**
  2. * 保存操作
  3. */
  4. @Test
  5. public void testSave(){
  6. Category category = new Category();
  7. category.setName("C-AA");
  8. Category category2 = new Category();
  9. category2.setName("C-BB");
  10. Item item = new Item();
  11. item.setName("I-AA");
  12. Item item2 = new Item();
  13. item2.setName("I-BB");
  14. //设定关联关系
  15. category.getItem().add(item);
  16. category.getItem().add(item2);
  17. category2.getItem().add(item);
  18. category2.getItem().add(item2);
  19. //保存操作
  20. session.save(category);
  21. session.save(category2);
  22. session.save(item);
  23. session.save(item2);
  24. }

②获取

  1. @Test
  2. public void testGet(){
  3. Category category = (Category) session.get(Category.class, 1);
  4. System.out.println(category.getName());
  5. //支持懒加载
  6. System.out.println(category.getItem());
  7. //需要连接中间表
  8. Set<Item> itmes = category.getItem();
  9. System.out.println(itmes.size());
  10. }

五.总结

n端

①实体类:在其中的一端设置集合属性,这里在Category里设置了Set集合

②映射文件:使用<se>t元素映射集合属性<key>元素映射字段名称,看起来与1对n相似,不同的是:

n对n:

<set> :元素name属性表示集合属性

<set> :元素table属性表示中间表

<key> :元素column属性指定的是外键,此外键引用的是该实体类所对应的数据表的主键

使用<many-to-many>元素来映射关联关系:

name属性指定另外一端的实体类的全类名,

column属性指定外键,此外建引用的是另一端实体类所对应的数据表的主键

详细如下:

  1. <!-- table:中间表 column:Category持久化类在中间表的外键-->
  2. <set name="item" table="CATEGORY_ITEM">
  3. <key column="C_ID"></key>
  4. <!-- 使用many-to-many指定多对多的关联关系,column:指定Set集合中的持久化类在中间表的外键列的名称,即Item持久化类在中间表的外键 -->
  5. <many-to-many class="Item" column="I_ID"></many-to-many>
  6. </set>

1对n

<set> :元素name属性表示集合属性

<set> :元素table属性指定的是n端的数据表

<key> :元素column属性指定的是外键,此外键引用的是该实体类所对应的数据表的主键

使用<one-to-many元素来映射关联关系,class属性指定n端的全类名

详细如下:

  1. <set name="bks" lazy="false" table="BOOKS" cascade="save-update,delete">
  2. <key column="PUBLISHER_ID"></key>
  3. <one-to-many class="com.withXml.oneTomany.entity.Books"/>
  4. </set>

n端

实体类和映射文件正常设置

Hibernate(8)_单向n对n的更多相关文章

  1. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  2. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  3. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  4. hibernate多对一单向外键

    hibernate多对一单向外键: 描述:

  5. Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...

  6. Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...

  7. Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...

  8. Hibernate(6)关联关系_单向n对1

    1.单向 n-1 关联只需从 n 的一端可以访问 1 的一端 2.实体类 n端:Order.java public class Order { private Integer orderId; pri ...

  9. Hibernate(7)关联关系_单向1对n

    1.单向一对多(@OneToMany)关联是比较少用的(一般用双向一对多代替). 2.实体类: 1端:Publishers.java public class Publishers { private ...

随机推荐

  1. Google搜索

    https://www.google.com/intl/br/insidesearch/tipstricks/all.html 如何用好谷歌等搜索引擎?

  2. JMeter高并发场景下存在请求无数据

  3. kudu的分区方式

    为了提供可扩展性,Kudu 表被划分为称为 tablets 的单元,并分布在许多 tablet servers 上.行总是属于单个 tablet .将行分配给 tablet 的方法由在表创建期间设置的 ...

  4. 带你了解zabbix整合ELK收集系统异常日志触发告警~

    今天来了解一下关于ELK的“L”-Logstash,没错,就是这个神奇小组件,我们都知道,它是ELK不可缺少的组件,完成了输入(input),过滤(fileter),output(输出)工作量,也是我 ...

  5. Flask---第一个例子--使用Flask写的【Hello World !】的web程序

    from flask import Flask;------->引入Flask插件,pip install Flask; app=Flask(__name__) #变量app是Flask的一个实 ...

  6. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第七集之SSH远程连接——克隆与更改配置】

    一.SSH远程连接 OpenSSH的安装 查看是否安装Openssh:rpm -qa | grep ssh搜索openssh安装包:yum search openssh安装openssh:yum in ...

  7. Java BigDecimal详解,提供了丰富的四舍五入规则

    java.math.BigDecimal类提供用于算术,刻度操作,舍入,比较,哈希算法和格式转换操作. toString()方法提供BigDecimal的规范表示.它使用户可以完全控制舍入行为. 提供 ...

  8. O(1) long long a*b%p

    inline ll muc(ll n,ll m){n%=p,m%=p;return (n*m-(ll)((long double)n*m/p)*p+p)%p;}

  9. javaScript中with函数用法实例分析

    javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...

  10. 【开源GPS追踪】 之 服务器硬伤

    前面就说过了,目前GPS 追踪的原理都是通过GPRS将数据发送到一个服务器上,如果回看数据就从服务器上去数据,服务器在整个系统中具有举足轻重的地位. 如果服务器坏了,整个系统几千台设备可能也就无法工作 ...