Hibernate(9)_双向n对n
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相关推荐
- myeclipse hbm2java_myeclipse试用小记----Hibernate多对一双向关联(2)
myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...
- myeclipse试用小记----Hibernate多对一双向关联(2)
myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...
- 【Hibernate步步为营】--双向关联一对一映射具体解释(一)
一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射 ...
- Hibernate关联关系映射-----双向一对多/多对一映射配置
转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...
- hibernate版本_基于jsp+mysql+Spring+hibernate+Struts 2的SSH在线蛋糕销售网站平台管理系统...
运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以.IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8. ...
- mybatis与mysql的优点_mybatis和hibernate比较_区别_优缺点
前言 Hibernate与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8.而Mybatis相对平静,工具较少,当前最 ...
- hibernate映射(单向双向的一对多、多对一以及一对一、多对一(转)
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...
- hibernate性能_改善Hibernate应用程序性能的7种方法
hibernate性能 Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩 ...
- hibernate语句_如何优化Hibernate EllementCollection语句
hibernate语句 介绍 Hibernate支持三种数据映射类型 : 基本 (例如String,int), Embeddable和Entity . 通常,数据库行被映射到Entity ,每个数据库 ...
最新文章
- android课程设计录音机,[转载]数字录音机(微机原理与接口技术-课程设计)
- Excel VBA参考文献中人名与年份格式转换
- msf rhosts设置文件_聊一聊基于 msf 的免杀项目测试过程
- 论Java程序的运行机制
- LeetCode5382. HTML 实体解析器
- Error Based Pruning剪枝算法、代码实现与举例
- 《C++ Primer 5th》笔记(4 / 19):表达式
- OpenCV中Canny边缘检测
- java 逆矩阵,java – 如何创建逆变换矩阵
- 独立站国际物流怎么解决?
- Docker 安装基本操作
- 【QT5】解决 QT 界面中文显示乱码问题
- 《天龙八部》通关攻略 一
- 移动站seo优化-怎么做好移动网站的SEO优化-移动seo优化方法软件免费
- Linux运行权限1009无标题,Linux权限管理练习
- C#DataGridView使用线程定时循环滚动数据
- 尼尔 android,尼尔转生wiki官网版
- 最适合十二星座的那些表白方式!
- 完美解决:Java微信语音amr格式转mp3格式,兼容Linux/Mac/Windows,支持Maven
- 如何破解带密码保护的word文件
热门文章
- iphone 热点 android,苹果的个人热点功能android手机能用吗
- Python django 社团管理系统
- 图像的腐蚀(erosion)和膨胀(dilation)
- 阿龙的学习笔记---转载及精炼总结github仓库:cpp-backend-reference
- 关于异步的几点思考......
- [Neck] 空间金字塔池化【池化策略】(Space Pyramid Pool, SPP)模块和路径聚合网络【增强】(Path Aggregation Network, PANet)的结构
- (单击)双击直接修改内容的代码
- DesignWare 加密文件 综合成GTECH 以便FPGA使用
- 计算机体系结构(简记)
- NetBIOS、WINS、DNS的联系和区别