1.概述
①双向 n-n 关联需要两端都使用集合属性
②双向n-n关联必须使用连接表
③集合属性应增加 key 子元素用以映射外键列, 集合元素里还应增加many-to-many子元素关联实体类
④在双向 n-n 关联的两边都需指定连接表的表名及外键列的列名. 两个集合元素 set 的 table 元素的值必须指定,而且必须相同。set元素的两个子元素:key 和 many-to-many 都必须指定 column 属性,其中,key 和 many-to-many 分别指定本持久化类和关联类在连接表中的外键列名,因此两边的 key 与 many-to-many 的column属性交叉相同。也就是说,一边的set元素的key的 cloumn值为a,many-to-many 的 column 为b;则另一边的 set 元素的 key 的 column 值 b,many-to-many的 column 值为 a.
⑤对于双向 n-n 关联, 必须把其中一端的 inverse 设置为 true, 否则两端都维护关联关系可能会造成主键冲突.
2.实体类
Category.java

public class Category {private Integer id;private String name;//添加集合属性private Set<Item> item = new HashSet<>();//忽略getter和setter方法...
}

Item.java

public class Item {private Integer id;private String name;//添加集合属性private Set<Category> category = new HashSet<Category>();//忽略getter和setter方法...
}

3.映射文件
Category.hbm.xml

<!-- package指定实体类路径,在这个节点中的实体类就可以不用写全类名了,auto-import设置为true(默认)是表示:使用HQL语句时,即使不指定具体的实体类,Hibernate会自动找到唯一的名称的实体映射,将其补全为全类名,因为无法确定那个类是所需要的。-->
<hibernate-mapping package="com.withXml.bothManyToMany.entity" auto-import="false"><class name="Category" table="BOTH_CATEGORYS"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="NAME" /></property><!-- table:中间表  column:Category持久化类在中间表的外键--><set name="item" table="BOTH_CATEGORY_ITEM" inverse="true"><key><column name="C_ID" /></key><!-- 使用many-to-many指定多对多的关联关系,column:指定Set集合中的持久化类在中间表的外键列的名称,即Item持久化类在中间表的外键 --><many-to-many class="Item" column="I_ID"></many-to-many></set></class>
</hibernate-mapping>

Item.hbm.xml

<hibernate-mapping package="com.withXml.bothManyToMany.entity" auto-import="false"><class name="Item" table="BOTH_ITEMS"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="NAME" /></property><!-- table:中间表  column:Item持久化类在中间表的外键--><set name="category" table="BOTH_CATEGORY_ITEM" inverse="false" lazy="true"><key><column name="I_ID" /></key><!-- 使用many-to-many指定多对多的关联关系,column:指定Set集合中的持久化类在中间表的外键列的名称,即Category持久化类在中间表的外键 --><many-to-many class="Category" column="C_ID"></many-to-many></set></class>
</hibernate-mapping>

4.CRUD测试
①保存操作

    @Testpublic void testSave(){Category category = new Category();category.setName("C-AA");Category category2 = new Category();category2.setName("C-BB");Item item = new Item();item.setName("I-AA");Item item2 = new Item();item2.setName("I-BB");//设定关联关系category.getItem().add(item);category.getItem().add(item2);category2.getItem().add(item);category2.getItem().add(item2);item.getCategory().add(category);item.getCategory().add(category2);item2.getCategory().add(category);item2.getCategory().add(category2);//保存操作session.save(category);session.save(category2);session.save(item);session.save(item2);}

②获取

@Testpublic void testGet(){Category category = (Category) session.get(Category.class, 1);System.out.println(category.getName());//支持懒加载System.out.println(category.getItem().toString());//需要连接中间表Set<Item> itmes = category.getItem();System.out.println(itmes.size());}

5.总结
①实体类:两端都需要添加集合属性
②映射文件:

Category端
<set> 元素:name属性指定该映射文件所对应的实体类的集合属性
table属性指定中间表,要与另一端映射文件中指定的中间表一致
<key> 元素:column属性指定外键,引用该映射文件对应数据表的主键,即自己的主键
<many-to-many>元素:class属性指定另一端的实体类,column指定外键,引用另一端实体类对应数据表的主键,即对方的主键,该值要与对方<key> 元素值一致
详细如下:

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

Item端
<set> 元素:name属性指定该映射文件所对应的实体类的集合属性
table属性指定中间表,要与另一端映射文件中指定的中间表一致
<key> 元素:column属性指定外键,引用该映射文件对应数据表的主键,即自己的主键
<many-to-many>元素:class属性指定另一端的实体类,column指定外键,引用另一端实体类对应数据表的主键,即对方的主键,该值要与对方<key> 元素值一致
详细如下:

<!-- table:中间表  column:Item持久化类在中间表的外键-->
<set name="category" table="BOTH_CATEGORY_ITEM" inverse="false" lazy="true"><key><column name="I_ID" /></key><!-- 使用many-to-many指定多对多的关联关系,column:指定Set集合中的持久化类在中间表的外键列的名称,即Category持久化类在中间表的外键 --><many-to-many class="Category" column="C_ID"></many-to-many>
</set>

③必须把其中一端的 inverse 设置为 true, 否则两端都维护关联关系可能会造成主键冲突.

Hibernate(9)_双向n对n相关推荐

  1. myeclipse hbm2java_myeclipse试用小记----Hibernate多对一双向关联(2)

    myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...

  2. myeclipse试用小记----Hibernate多对一双向关联(2)

    myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...

  3. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)

    一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射 ...

  4. Hibernate关联关系映射-----双向一对多/多对一映射配置

    转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...

  5. hibernate版本_基于jsp+mysql+Spring+hibernate+Struts 2的SSH在线蛋糕销售网站平台管理系统...

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以.IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8. ...

  6. mybatis与mysql的优点_mybatis和hibernate比较_区别_优缺点

    前言 Hibernate与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8.而Mybatis相对平静,工具较少,当前最 ...

  7. hibernate映射(单向双向的一对多、多对一以及一对一、多对一(转)

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...

  8. hibernate性能_改善Hibernate应用程序性能的7种方法

    hibernate性能 Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩 ...

  9. hibernate语句_如何优化Hibernate EllementCollection语句

    hibernate语句 介绍 Hibernate支持三种数据映射类型 : 基本 (例如String,int), Embeddable和Entity . 通常,数据库行被映射到Entity ,每个数据库 ...

最新文章

  1. android课程设计录音机,[转载]数字录音机(微机原理与接口技术-课程设计)
  2. Excel VBA参考文献中人名与年份格式转换
  3. msf rhosts设置文件_聊一聊基于 msf 的免杀项目测试过程
  4. 论Java程序的运行机制
  5. LeetCode5382. HTML 实体解析器
  6. Error Based Pruning剪枝算法、代码实现与举例
  7. 《C++ Primer 5th》笔记(4 / 19):表达式
  8. OpenCV中Canny边缘检测
  9. java 逆矩阵,java – 如何创建逆变换矩阵
  10. 独立站国际物流怎么解决?
  11. Docker 安装基本操作
  12. 【QT5】解决 QT 界面中文显示乱码问题
  13. 《天龙八部》通关攻略 一
  14. 移动站seo优化-怎么做好移动网站的SEO优化-移动seo优化方法软件免费
  15. Linux运行权限1009无标题,Linux权限管理练习
  16. C#DataGridView使用线程定时循环滚动数据
  17. 尼尔 android,尼尔转生wiki官网版
  18. 最适合十二星座的那些表白方式!
  19. 完美解决:Java微信语音amr格式转mp3格式,兼容Linux/Mac/Windows,支持Maven
  20. 如何破解带密码保护的word文件

热门文章

  1. iphone 热点 android,苹果的个人热点功能android手机能用吗
  2. Python django 社团管理系统
  3. 图像的腐蚀(erosion)和膨胀(dilation)
  4. 阿龙的学习笔记---转载及精炼总结github仓库:cpp-backend-reference
  5. 关于异步的几点思考......
  6. [Neck] 空间金字塔池化【池化策略】(Space Pyramid Pool, SPP)模块和路径聚合网络【增强】(Path Aggregation Network, PANet)的结构
  7. (单击)双击直接修改内容的代码
  8. DesignWare 加密文件 综合成GTECH 以便FPGA使用
  9. 计算机体系结构(简记)
  10. NetBIOS、WINS、DNS的联系和区别