1. 程式人生 > >雙向多對多對映

雙向多對多對映

在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其為關係維護端。

如下所示,為Category類片段:

@ManyToMany(mappedBy="categories")
public Set<Item> getItems() {
	return items;
}

這樣解釋mappedBy:

  • 在哪個model中的某個註解使用了mappedBy,則該model放棄維持關聯關係;如上所示,這裡為Category放棄維持關聯關係,以Item為主;
  • 在哪個屬性上面的註解使用了mappedBy屬性,則該註解標註的屬性的實體類維持關聯關係。如上所示,這裡以Item為主。

【1】item與Category

item:category = N:N ,item為關係維護端(主),category為從。

item類如下:

@Table(name="JPA_ITEMS")
@Entity
public class Item {

	private Integer id;
	private String itemName;
	
	private Set<Category> categories = new HashSet<>();

	@GeneratedValue
	@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類如下:

@Table(name="JPA_CATEGORIES")
@Entity
public class Category {

	private Integer id;
	private String categoryName;
	
	private Set<Item> items = new HashSet<>();

	@GeneratedValue
	@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;
	}
}

【2】多對多持久化操作

示例程式碼如下:

//多對多的儲存
	@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);
	}
	

控制檯輸出如下:

Hibernate: 
    insert 
    into
        JPA_ITEMS
        (ITEM_NAME) 
    values
        (?)
Hibernate: 
    insert 
    into
        JPA_ITEMS
        (ITEM_NAME) 
    values
        (?)
Hibernate: 
    insert 
    into
        JPA_CATEGORIES
        (CATEGORY_NAME) 
    values
        (?)
Hibernate: 
    insert 
    into
        JPA_CATEGORIES
        (CATEGORY_NAME) 
    values
        (?)
Hibernate: 
    insert 
    into
        ITEM_CATEGORY
        (ITEM_ID, CATEGORY_ID) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        ITEM_CATEGORY
        (ITEM_ID, CATEGORY_ID) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        ITEM_CATEGORY
        (ITEM_ID, CATEGORY_ID) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        ITEM_CATEGORY
        (ITEM_ID, CATEGORY_ID) 
    values
        (?, ?)

資料庫結果如下:

這裡寫圖片描述

【3】雙向多對多獲取操作

先獲取非維護關聯關係的一方,程式碼示例如下:

	@Test
	public void testManyToManyFind(){
		Category category = entityManager.find(Category.class, 3);
		System.out.println(category.getCategoryName());
		System.out.println(category.getItems().size());
	}

控制檯輸出如下:

這裡寫圖片描述

如果先獲取維護關聯關係的一方呢?

示例程式碼如下:

	
	@Test
	public void testManyToManyFind(){
			Item item = entityManager.find(Item.class, 5);
			System.out.println(item.getItemName());
			
			System.out.println(item.getCategories().size());
		
	}

控制檯輸出如下:

這裡寫圖片描述

故而總結如下:

對於關聯的集合物件, 預設使用懶載入的策略;

使用維護關聯關係的一方獲取, 還是使用不維護關聯關係的一方獲取, SQL 語句相同。

相關推薦

Hibernate,關係對映一單向關聯、雙向關聯、一對一主鍵關聯、一對一外來鍵關聯、關係關聯

2018-11-10  22:27:02開始寫   下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構:     下圖內容hibernate對映檔案結構介紹   下圖內容hibernate

JPA - 雙向對映

在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其為關係維護端。 【1】item與Category item:category = N:N ,item為關係維護端(主),catego

JPA學習筆記(10)——對映雙向關聯關係

                     多對多關聯比如現在有兩個實體類:1. Product(商品)2. Category(類別)一個商品可以有多個類別,一個類別也可以有多個商品,這就形成了多對多的關係Productpackage com.jpa.helloworld2;import java.util.L

Hibernate學習(四)———— 雙向對映關係

一、小疑問的解答        問題一:到這裡,有很多學習者會感到困惑,因為他不知道使用hibernate是不是需要自己去建立表,還是hibernate全自動,如果需要自己建立表,那麼主外來鍵這種設定也是自己設定嗎?這讓人感到很困惑,現在就來解決一下這個小疑問(如果知道了的可以直接跳過看下面的多對多對映關係

Hibernate基於主鍵的單項,雙向對映關係

今天我們來一起談論下hibernate的基於主鍵的單項,雙向多對多對映關係 首先多對多都是基於主鍵的,沒有基於外來鍵的說法 1.基於主鍵的單項多對多 在這裡就是說中間stuobject是一張關係表,將兩張表的主鍵進行關聯,形成了多對多的關係 程式碼如

雙向對映關係

兩個實體類 public class Grade implements Serializable { private int gid; private String gname; private String gdesc; //

雙向對映

在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其為關係維護端。 如下所示,為Category類片段: @ManyToMany(mappedBy="categori

JPA:對映雙向關聯關係

.在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過@ManyToMany註釋中指定 mappedBy屬性來標識其為關係維護端 1.這裡用商品(Item)和類別(Category)舉例子,一個商品可以對應多個種類,而一個種類也可以對應多個商品

hibernate的映射之四(雙向關聯)

als oot bean odi 生成 指定 數據庫方言 映射文件 格式化sql Many-to-Many 多對多的映射可以使用一組Java集合不包含任何重復的元素來實現。我們已經看到了Hibernate如何設置映射集合。 集(SET)被映射到與映射表中<set&g

hibernate雙向關系映射的級聯配置

hibernate多對多雙向關系映級配置多對多關系映射 set元素的屬性:cascade:級聯操作。取值:save-update:級聯保存更新delete:級聯刪除。 註意:在多對多雙向關系映射中,不能配置雙向級聯刪除。但是可以配置雙向級聯保存更新。 <set name=&q

個人Hibernate筆記:兩張表對映以後,如何查出一表裡面的資料?

專案有兩張表:應用型別表1,應用表2,兩張表已經用Hibernate映射了,之前都是通過型別Id相對應的應用Id,現在要通過應用Id來查詢與之對應的型別Id,如何做呢? 由於之前一直沒有用過這樣的查詢方式,自己胡亂鼓搗以後,終於得出了方法,如下: <% for (int y =

Hibernate,關系映射的一單向關聯、雙向關聯、一對一主鍵關聯、一對一外鍵關聯、關系關聯

nat 延遲加載 alt ima orm 雙向關聯 映射文件 結構 spa 2018-11-10 22:27:02開始寫 下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構: 下圖內容hibernate映射文件結構介紹

MyBatis關聯對映關係,一對一,一對

“縱許悠揚度朱戶,終愁人影隔窗紗” 前言 客觀世界中的物件很少有孤立存在的,例如班級,往往與班級的學生存在關聯關係,如果得到某個班級的例項,那麼應該可以直接獲取班級對應的全部學生。反過來,如果已經得到個學生的例項,那麼也應該可以訪問該學生對應的班級。這種例項之間的互相訪問就是關聯關係

Hibernate - 關聯關係對映

【1】單向多對多 如Category:Item=n:n。 在關係資料模型中,是需要一箇中間表Category-Item來維持這種關聯關係的。該表中存放Category_ID和Item_ID。 與 1-n 對映類似,必須為 set 集合元素新增 key 子元素,指定 CA

一對一對映對映

一對一對映之resultType 需求:聯合order表和user表,查詢每個使用者的訂單資訊和使用者資訊 步驟: 1 定義orders訂單PO類 屬性與表對應 2 由於要得到使用者的訂單列表,所以訂單類中要有user屬性 建立OrdersExt擴充套件類,並繼承Orders類 3

【轉自】mybatis入門基礎----高階對映(一對一,一對)

  轉自:http://www.cnblogs.com/selene/p/4627446.html 可參考https://blog.csdn.net/liu_yanzhao/article/details/78573023 閱讀目錄 一:訂單商品資料模型 二、一

hibernate中對映配置詳細解析

1.hibernate.cfg.xml檔案 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd

Hibernate關聯對映(一對/

3.  Hibernate關聯對映 上接Hibernate持久化類:https://blog.csdn.net/biggerchong/article/details/84260707 目錄 3.  Hibernate關聯對映 3.1 資料庫

Hibernate一對雙向雙向,排序

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hiberna

菜雞的Java課筆記 對映

要求:    1.將資料還原為簡單java類    2.資料的輸出:        可以根據一個使用者輸出它對應的角色以及每個角色對應的許可權,以及包含的具體的許可權詳情: &nb