欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

JPA中实现双向多对多的关联关系(附代码下载)

发布时间:2025/3/19 编程问答 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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)@Idpublic 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")})@ManyToManypublic 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)@Idpublic 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>

添加位置如下

 


  打开单元测试类,编写单元测试方法

  

//多对所的保存@Testpublic 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 语句相同.@Testpublic void testManyToManyFind(){Item item = entityManager.find(Item.class, 5);System.out.println(item.getItemName());System.out.println(item.getCategories().size());}

查询效果

 

示例代码下载

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12054302

总结

以上是生活随笔为你收集整理的JPA中实现双向多对多的关联关系(附代码下载)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。