JPA中实现双向多对多的关联关系(附代码下载)
場(chǎng)景
JPA入門簡(jiǎn)介與搭建HelloWorld(附代碼下載):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937
JPA中實(shí)現(xiàn)單向多對(duì)一的關(guān)聯(lián)關(guān)系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103511623
JPA中實(shí)現(xiàn)單向一對(duì)多的關(guān)聯(lián)關(guān)系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103520083
JPA中實(shí)現(xiàn)雙向一對(duì)多的關(guān)聯(lián)關(guān)系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103523564
JPA中實(shí)現(xiàn)雙向一對(duì)一的關(guān)聯(lián)關(guān)系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103530292
按照上面的流程實(shí)現(xiàn)以上映射關(guān)系后,怎樣在JPA中實(shí)現(xiàn)雙向多對(duì)多的映射關(guān)系。
比如說商品與分類就是雙向多對(duì)多的關(guān)系。
一個(gè)商品可以有多個(gè)分類,一個(gè)分類可以有多個(gè)商品。
在雙向多對(duì)多關(guān)系中,我們必須指定一個(gè)關(guān)系維護(hù)端(owner side),可以通過 @ManyToMany 注釋中指定 mappedBy 屬性來標(biāo)識(shí)其為關(guān)系維護(hù)端。
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號(hào)
霸道的程序猿
獲取編程相關(guān)電子書、教程推送與免費(fèi)下載。
實(shí)現(xiàn)
首先連接數(shù)據(jù)庫,為了構(gòu)建出雙向多對(duì)多的關(guān)系,我們需要新建三個(gè)表,商品表、分類表、映射關(guān)系表。
新建商品表JPA_ITEMS
?
其中id為自增非空主鍵
然后新建類別表JPA_CATERORIES
?
其中id為自增非空主鍵
然后再新建關(guān)聯(lián)表ITEM_CATEGORY
?
不要添加主鍵。
然后打開Eclise中上面一直使用的JPA的項(xiàng)目,在包下新建實(shí)體類,這里選擇使用ITEM作為雙向關(guān)系維護(hù)的一方。
新建Item實(shí)體類
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 注解來映射多對(duì)多關(guān)聯(lián)關(guān)系//使用 @JoinTable 來映射中間表//1. name 指向中間表的名字//2. joinColumns 映射當(dāng)前類所在的表在中間表中的外鍵//2.1 name 指定外鍵列的列名//2.2 referencedColumnName 指定外鍵列關(guān)聯(lián)當(dāng)前表的哪一列//3. inverseJoinColumns 映射關(guān)聯(lián)的類所在中間表的外鍵@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;} }注:
在上面注釋中已經(jīng)說明怎樣維護(hù)關(guān)聯(lián)關(guān)系。
然后再新建類別實(shí)體類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")來指明關(guān)系,其中categories要與item中的屬性名相對(duì)應(yīng)。
然后打開persistense.xml配置文件,將此兩個(gè)實(shí)體類進(jìn)行添加
??<class>com.badao.jpa.helloworld.Item</class><class>com.badao.jpa.helloworld.Category</class>添加位置如下
?
? 打開單元測(cè)試類,編寫單元測(cè)試方法
??
//多對(duì)所的保存@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");//設(shè)置關(guān)聯(lián)關(guān)系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);//執(zhí)行保存entityManager.persist(i1);entityManager.persist(i2);entityManager.persist(c1);entityManager.persist(c2);}運(yùn)行單元測(cè)試,查看商品表
?
查看類別表
?
查看關(guān)聯(lián)表
?
上面是測(cè)試的保存方法,再新建測(cè)試方法測(cè)試查詢
?
?//對(duì)于關(guān)聯(lián)的集合對(duì)象, 默認(rèn)使用懶加載的策略.//使用維護(hù)關(guān)聯(lián)關(guān)系的一方獲取, 還是使用不維護(hù)關(guān)聯(lián)關(guān)系的一方獲取, 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
總結(jié)
以上是生活随笔為你收集整理的JPA中实现双向多对多的关联关系(附代码下载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo监控中心搭建-dubbo-mo
- 下一篇: 几百个Android开源个性化控件、工具