雙向多對多對映
在雙向多對多關係中,我們必須指定一個關係維護端(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