Hibernate(8)_单向n对n
1.n-n 的关联必须使用连接表
与1-n映射类似,必须为set集合元素添加 key 子元素,需要指定中间表
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;
//忽略getter和setter
...
}
3.映射文件
Category.hbm.xml
<hibernate-mapping package="com.withXml.manyToMany.entity">
<class name="Category" table="CATEGORY">
<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="CATEGORY_ITEM">
<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.manyToMany.entity">
<class name="Item" table="ITEM">
<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>
</class>
</hibernate-mapping>
4.CRUD测试
①添加
/**
* 保存操作
*/
@Test
public 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);
//保存操作
session.save(category);
session.save(category2);
session.save(item);
session.save(item2);
}
②获取
@Test
public void testGet(){
Category category = (Category) session.get(Category.class, 1);
System.out.println(category.getName());
//支持懒加载
System.out.println(category.getItem());
//需要连接中间表
Set<Item> itmes = category.getItem();
System.out.println(itmes.size());
}
五.总结
n端
①实体类:在其中的一端设置集合属性,这里在Category里设置了Set集合
②映射文件:使用<se>
t元素映射集合属性<key>
元素映射字段名称,看起来与1对n相似,不同的是:
n对n:
<set>
:元素name属性表示集合属性
<set>
:元素table属性表示中间表
<key>
:元素column属性指定的是外键,此外键引用的是该实体类所对应的数据表的主键
使用<many-to-many>
元素来映射关联关系:
name属性指定另外一端的实体类的全类名,
column属性指定外键,此外建引用的是另一端实体类所对应的数据表的主键
详细如下:
<!-- table:中间表 column:Category持久化类在中间表的外键-->
<set name="item" table="CATEGORY_ITEM">
<key column="C_ID"></key>
<!-- 使用many-to-many指定多对多的关联关系,column:指定Set集合中的持久化类在中间表的外键列的名称,即Item持久化类在中间表的外键 -->
<many-to-many class="Item" column="I_ID"></many-to-many>
</set>
1对n
<set>
:元素name属性表示集合属性
<set>
:元素table属性指定的是n端的数据表
<key>
:元素column属性指定的是外键,此外键引用的是该实体类所对应的数据表的主键
使用<one-to-many
元素来映射关联关系,class属性指定n端的全类名
详细如下:
<set name="bks" lazy="false" table="BOOKS" cascade="save-update,delete">
<key column="PUBLISHER_ID"></key>
<one-to-many class="com.withXml.oneTomany.entity.Books"/>
</set>
n端
实体类和映射文件正常设置
Hibernate(8)_单向n对n的更多相关文章
- 009一对一 主键关联映射_单向(one-to-one)
009一对一 主键关联映射_单向(one-to-one) ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...
- hibernate多对一单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- hibernate多对一单向外键
hibernate多对一单向外键: 描述:
- Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...
- Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...
- Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...
- Hibernate(6)关联关系_单向n对1
1.单向 n-1 关联只需从 n 的一端可以访问 1 的一端 2.实体类 n端:Order.java public class Order { private Integer orderId; pri ...
- Hibernate(7)关联关系_单向1对n
1.单向一对多(@OneToMany)关联是比较少用的(一般用双向一对多代替). 2.实体类: 1端:Publishers.java public class Publishers { private ...
随机推荐
- MySQL应用异常问题解决
MySQL错误:Every derived table must have its own alias 派生表都必须有自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时候子查询出来的 ...
- file标签 - 图片上传前预览 - FileReader & 网络图片转base64和文件流
记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...
- zabbix通过自动发现tomcat应用端口监控连接数
192.168.10.98上 netstat -anp | wc -l netstat -anp|grep 8094 | grep ESTABLISHED | wc -l netstat -anp|g ...
- Java程序编译和运行过程之 一个对象的生命之旅(类加载和类加载器)
Java程序从创建到运行要经过两个大步骤 1:源文件(.java)由编译器编译成字节码ByteCode(.class) 2:字节码由Java虚拟机解释并运行 源文件编译成字节码,主要分成两个部分: 1 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-3项目架构说明
本文目录1. 摘要2. 框架介绍 3. 权限管理之多一点说明4. 总结 1. 摘要 NCMVC角色权限管理框架是由最近练习Net Core时抽时间整理的系统,后续能不能发展成一个cms还要看朋友们是 ...
- netty05(netty的一些介绍)
netty的一些理论 netty是一个异步事件驱动的网络应用框架(NIO框架),所有IO操作都是异步非阻塞的,NIO是对IO的一个补充 用于开发客户端和服务器的通信(TCP/UDP)长短连接 nett ...
- element-ui upload组件上传
方法一: <el-table-column label="操作"> <template slot-scope="scope"> < ...
- 在 Windows 中为高级用户配置 IPv6 的指南
在 Windows 中为高级用户配置 IPv6 的指南 适用于: Windows 10, version 1809Windows Server 2019, all versionsWindows Se ...
- 网络编程-线程-3、通过继承Thread类创建线程
知识点:之前第一节介绍创建线程的方法是:通过threading.Thread(target=函数名不要加括号)创建一个对象,通过对象调用start方法创建并启动线程: ...
- Codeforces 852G Bathroom terminal 【Trie树】
<题目链接> 题目大意: 现在给定出n个字符串,并且进行m此询问,每次询问给出一个匹配串,每次询问都给出该匹配串能够匹配的字符串个数(题目只出现字符'a'~'e').'?'可以看成任意字符 ...