JPA中实现双向多对多的关联关系(附代码下载)
场景
JPA入门简介与搭建HelloWorld(附代码下载):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937
JPA中实现单向多对一的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103511623
JPA中实现单向一对多的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103520083
JPA中实现双向一对多的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103523564
JPA中实现双向一对一的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103530292
按照上面的流程实现以上映射关系后,怎样在JPA中实现双向多对多的映射关系。
比如说商品与分类就是双向多对多的关系。
一个商品可以有多个分类,一个分类可以有多个商品。
在双向多对多关系中,我们必须指定一个关系维护端(owner side),可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系维护端。
注:
博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
首先连接数据库,为了构建出双向多对多的关系,我们需要新建三个表,商品表、分类表、映射关系表。
新建商品表JPA_ITEMS
其中id为自增非空主键
然后新建类别表JPA_CATERORIES
其中id为自增非空主键
然后再新建关联表ITEM_CATEGORY
不要添加主键。
然后打开Eclise中上面一直使用的JPA的项目,在包下新建实体类,这里选择使用ITEM作为双向关系维护的一方。
新建Item实体类
package com.badao.jpa.helloworld; import java.util.HashSet;
import java.util.Set; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table; @Table(name="JPA_ITEMS")
@Entity
public class Item { private Integer id;
private String itemName; private Set<Category> categories = new HashSet<>(); @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name="ITEM_NAME")
public String getItemName() {
return itemName;
} public void setItemName(String itemName) {
this.itemName = itemName;
} //使用 @ManyToMany 注解来映射多对多关联关系
//使用 @JoinTable 来映射中间表
//1. name 指向中间表的名字
//2. joinColumns 映射当前类所在的表在中间表中的外键
//2.1 name 指定外键列的列名
//2.2 referencedColumnName 指定外键列关联当前表的哪一列
//3. inverseJoinColumns 映射关联的类所在中间表的外键
@JoinTable(name="ITEM_CATEGORY",
joinColumns={@JoinColumn(name="ITEM_ID", referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="CATEGORY_ID", referencedColumnName="ID")})
@ManyToMany
public Set<Category> getCategories() {
return categories;
} public void setCategories(Set<Category> categories) {
this.categories = categories;
}
}
注:
在上面注释中已经说明怎样维护关联关系。
然后再新建类别实体类Category
package com.badao.jpa.helloworld; import java.util.HashSet;
import java.util.Set; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table; @Table(name="JPA_CATEGORIES")
@Entity
public class Category { private Integer id;
private String categoryName; private Set<Item> items = new HashSet<>(); @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name="CATEGORY_NAME")
public String getCategoryName() {
return categoryName;
} public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
} @ManyToMany(mappedBy="categories")
public Set<Item> getItems() {
return items;
} public void setItems(Set<Item> items) {
this.items = items;
}
}
在这方主要是通过 @ManyToMany(mappedBy="categories")来指明关系,其中categories要与item中的属性名相对应。
然后打开persistense.xml配置文件,将此两个实体类进行添加
<class>com.badao.jpa.helloworld.Item</class>
<class>com.badao.jpa.helloworld.Category</class>
添加位置如下
打开单元测试类,编写单元测试方法
//多对所的保存
@Test
public void testManyToManyPersist(){
Item i1 = new Item();
i1.setItemName("i-1"); Item i2 = new Item();
i2.setItemName("i-2"); Category c1 = new Category();
c1.setCategoryName("C-1"); Category c2 = new Category();
c2.setCategoryName("C-2"); //设置关联关系
i1.getCategories().add(c1);
i1.getCategories().add(c2); i2.getCategories().add(c1);
i2.getCategories().add(c2); c1.getItems().add(i1);
c1.getItems().add(i2); c2.getItems().add(i1);
c2.getItems().add(i2); //执行保存
entityManager.persist(i1);
entityManager.persist(i2);
entityManager.persist(c1);
entityManager.persist(c2);
}
运行单元测试,查看商品表
查看类别表
查看关联表
上面是测试的保存方法,再新建测试方法测试查询
//对于关联的集合对象, 默认使用懒加载的策略.
//使用维护关联关系的一方获取, 还是使用不维护关联关系的一方获取, SQL 语句相同.
@Test
public void testManyToManyFind(){
Item item = entityManager.find(Item.class, );
System.out.println(item.getItemName());
System.out.println(item.getCategories().size());
}
查询效果
示例代码下载
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12054302
最新文章
- [转][iOS]NSHash​Table &; NSMap​Table
- MATLAB神经网络原理与实例精解视频教程
- [vim] vim入门
- 关于nginx的限速模块
- C#读书笔记之并行任务
- [原]捉虫记3:_ConectionPtr指针调用open失败
- OpenJudge 2738 浮点数加法
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- ccui.ScrollView 扩展
- 点击<;a>;标签,禁止页面自动跳到顶部的解决办法
- node.js 解析xml BOM问题(xmlreader sax.js)
- jquery php 百度搜索框智能提示效果
- sqlite数据库之简单操作
- poj-1028 -网页导航
- txt文件按行处理工具类(可以截取小说、分析日志等)【我】
- HttpClient和HttpURLConnection的使用和区别(下)
- Hunter’s Apprentice 【判断多边形边界曲线顺逆时针】
- Android实践项目汇报(二)
- 关闭浏览器时的友情提醒jQuery写法
- [原][osgearth]osgearthElvation中的一帧