1. 程式人生 > >hibernate5(15)註解對映[7]集合關聯

hibernate5(15)註解對映[7]集合關聯

集合註解對映

集合關係對映可以看成是一對多關係對映的一種簡化,在一個電商系統裡,出售的產品可能會有多張展示圖片,如果我們使用一對多來建立關聯對映時,需要建立一個實體類Images,裡面可能有屬性:圖片在伺服器的訪問路徑url和圖片所屬產品productId。但如果我們使用集合關係對映,則無需新建一個實體類,只需在Product中定義一個集合成員屬性即可。

Set集合

在產品中,我們的圖片路徑一般是不會相同的,我們可以使用Set集合來建立對映
我們下面來看這一需求的配置示例:

@Entity
@Table(name = "t_product")
public class Product
{
@Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; @ElementCollection(fetch = FetchType.LAZY)//使用此註解配置集合對映關聯 private Set<String> images ; //忽略get和set方法 }

下面是我們的測試方法:

Product product = new Product();
product.setName("product"
); Set<String> imagesUrl = new HashSet<String>(); for(int i = 0 ; i < 5; i ++){ imagesUrl.add("imageUrl"+ i); } product.setImages(imagesUrl); session.save(product);

執行上述測試方法,我們查詢資料庫:
這裡寫圖片描述
即集合對映的內部實現是hibernate會為我們單獨建立一張表來儲存這些資訊。
如果我們想要自定義這張表的表明,屬性名,我們可以通過以下配置:

@ElementCollection(fetch = FetchType.LAZY)
@JoinTable
(name = "t_product_images",joinColumns = @JoinColumn(name = "proId")) @Column(name = "imagesUrl") private Set<String> images ;

重新執行測試方法,查詢資料庫:
這裡寫圖片描述
表名和屬性名都被成功修改了。

List集合

使用Set集合能確保元素屬性不重複,但我們無法確定元素的插入順序,與Set集合不同,List集合在資料庫中多了一個索引屬性,我們根據索引屬性來獲取記錄,同時也可以根據索引屬性得知元素的插入先後順序。
下面我們使用list來模擬一個數據庫級別的排隊系統:在一個醫院有很多個醫生,每個醫生都有很多病人排隊就診。下面是我們的醫生類:

@Entity
@Table(name = "t_doctor")
public class Doctor {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    @ElementCollection(fetch = FetchType.LAZY)
    @JoinTable(name = "t_patient",joinColumns = @JoinColumn(name = "doctor_id"))
    @Column(name = "patient_name")
    //@IndexColumn(name = "orders",base = 100)在新版本中,此註解已被廢棄,推薦使用下面兩個註解取代
    @OrderColumn(name = "orders")//表示索引列名為patient_name
    @ListIndexBase(100)//表示索引從100開始
    List<String> patients = new ArrayList<String>();
}

下面是我們的新增測試程式碼:

Doctor doctor = new Doctor();
doctor.setName("doctor");
List<String> patients = new ArrayList<String>();
for(int i = 0 ; i < 5; i ++){
    patients.add("patient" + i);
}
doctor.setPatientName(patients);
session.save(doctor);

執行程式碼,檢視資料庫:
這裡寫圖片描述
資料被成功插入,並且細心對比前面set集合圖片,我們發現這裡是有序的,執行下列查詢操作:

Doctor doctor = session.get(Doctor.class, 1);
System.out.println(doctor);
for(String string : doctor.getPatientName()){
    System.out.println(string);
}

控制檯列印:
這裡寫圖片描述
說明我們獲得的資料是有序的,這樣就可以動態刪除第一個,而新紀錄從尾部加入,實現一個佇列的效果。
事實上,我們使用List來配置一對多對映中的多方,也能完成同樣的效果

Map集合

在產品中,可能會有不同的規格物件不同的價格,這種需求我們可以通過Map集合對映來實現:

package com.zeng4.model;

import java.util.Map;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKey;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
@Entity
@Table(name = "t_product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    @ElementCollection
    @JoinTable(name = "t_specs_prize",joinColumns = @JoinColumn(name = "product_id"))
    @Column(name = "prize")//對應規格的價格
    @MapKeyColumn(name = "specs")//對應鍵值列名稱
    private Map<String, Double> prize;

}

下面是我們的測試方法:

Product product = new Product();
product.setName("prodcut_with_many_prize");
HashMap prizes= new HashMap();
for(int i = 0 ; i < 5 ; i ++){
prizes.put("specs"+i,1.2* i);
}
product.setPrize(prizes);
session.save(product);

執行測試方法,查詢資料庫:
這裡寫圖片描述
我們的Product類中的Map集合屬性key是規格,對應與specs,值是價格,對應於peize。
Map集合關聯操作,我們可以通過類似下面程式碼進行:

Product product = session.get(Product.class, 1);
for(Entry<String, Double> entry : product.getPrize().entrySet()){
    System.out.println("specs = " + entry.getKey() + "————prize = " + entry.getValue());
}

執行方法,控制檯列印:
這裡寫圖片描述

原始碼下載

相關推薦

hibernate5(15)註解對映[7]集合關聯

集合註解對映 集合關係對映可以看成是一對多關係對映的一種簡化,在一個電商系統裡,出售的產品可能會有多張展示圖片,如果我們使用一對多來建立關聯對映時,需要建立一個實體類Images,裡面可能有屬性:圖片在伺服器的訪問路徑url和圖片所屬產品productId。但

hibernate5(12)註解對映[4]一對一外來鍵關聯

在實際部落格網站中,文章內容的資料量非常多,它會影響我們檢索文章其它資料的時間,如查詢釋出時間、標題、類別的等。這個時候,我們可以嘗試將文章內容存在另一張表中,然後建立起文章——文章內容的一對一對映 一對一關聯有兩種方式,一種是外來鍵關聯,另一種是複合主鍵關聯

hibernate5(11)註解對映[3]一對多多對一雙向關聯

在上兩篇文章裡,我們詳細地分別講解了一對多和多對一的單向關聯配置的具體屬性含義,在這一篇文章裡,我們完成兩者的的整合建立雙向關聯。 在實際的部落格網站中,我們可能需要根據文章讀取作者(使用者)資訊,但肯定也要讓使用者能獲取自己的文章資訊,針對這種需求,我們可以

hibernate5(13)註解對映[5]一對一共享主鍵關聯

一對一共享主鍵 下面我們直接通過例項來講解共享主鍵配置: 主鍵主控方:Article package com.zeng2.model; @Table(name = "t_article2")

hibernate5(9)註解對映[1]多對一單向關聯

在部落格網站中,我們可能需要從某一篇文章找到其所關聯的作者,這就需要從文章方建立起對使用者的關聯,即是多對一的對映關係。 現在先看一個配置例項:我們的文章實體類 package com.zeng.model; import javax.persistenc

hibernate5(12)註解映射[4]一對一外鍵關聯

rom 成功 查詢 content cat 回憶 target his var 在實際博客站點中,文章內容的數據量非常多,它會影響我們檢索文章其他數據的時間,如查詢公布時間、標題、類別的等。這個時候,我們能夠嘗試將文章內容存在還有一張表中,然後建立起文章

Mybatis3.1-[tp_34-35]-_對映檔案_select_resultMap關聯查詢_collection定義關聯集合封裝規則_collection分步查詢_延遲載入

筆記要點出錯分析與總結工程組織   1.定義介面 interface DepartmentMapper package com.dao; import com.bean.Department; public interface DepartmentMapper {

MyBatis總結(二十五)--任務34:MyBatis_對映檔案_select_resultMap_關聯查詢_collection定義關聯集合封裝規則

本文內容來自上矽谷 主要介紹了collection的基本用法 本專案的目錄結構如下 Junit @Test public void test06() throws IOException{ SqlSessionFactory sqlSessionFac

SpringMVC 7註解對映限定

※ .請求方法對映限定     一般獲取資料為GET請求方法,提交表單一般為POST請求方法。但之前URL路徑對映方式對任意請求方法都是接受的,     因此我們需要某種方式來告訴相應的功能處理方法只處理如GET方式的請求或POST方式的請求。 @Reques

7對映一對多關聯關係

以客戶和訂單的關係為例,一個客戶能發出多個訂單,而一個訂單(order)只能屬於一個客戶(customer)。從訂單到客戶的關聯是多對一關聯,這意味著每個訂單物件都會引用一個客戶物件,因此在訂單類中應該定義一個客戶型別的屬性,來引用關聯的客戶物件。 從客戶到訂單是一對多的關聯,這意味著每個客

hibernate5(5)實體對映註解配置[2]主鍵生成策略

@GeneratedValue基本註解型別 在上一篇文章中,我們講到了JPA使用@GeneratedValue註解來定義生成策略,而關於註解生成策略有4種基本支援型別: 1. GenerationType.TABLES 當前主鍵的值單獨儲存到一個數據庫的表

hibernate5(4)實體對映註解配置[1]註解全面解析

相對於經典風格的實體配置xxx.hbm.xml,新版本hibernate使用JPA(Java Persistence API)註解配置能使我們的開發更加敏捷便利.在本系列前面部分的文章中,我們圍繞JPA註解風格配置來逐步深入學習。 配置例項 下面先看一個

springmvc學習筆記(13)-springmvc註解開發之集合類型參數綁定

return 可擴展性 list .net items trac class javascrip lin springmvc學習筆記(13)-springmvc註解開發之集合類型參數綁定

軟工網絡15團隊作業7——Alpha沖刺之事後諸葛亮

簡單的 junit單元測試 unit test 分鐘 定義 讀取 學習 安裝測試 站立會議 設想和目標 我們的軟件要解決什麽問題?是否定義得很清楚?是否對典型用戶和典型場景有清晰的描述? 解決大學生利用碎片化時間來學習英語單詞,備考相應英語等級考試。 微信程序的b名字叫

7 集合運算

  7 集合運算 7-1 表的加減法   本章將會和大家一起學習“集合運算”操作。在數學領域,“集合”表示“(各種各樣的)事物的總和”;在資料庫領域,表示“記錄的集合”。具體來說,表、檢視和查詢的執行結果都是“記錄的集合”。 所謂集合運算,就是對滿足同一規則的記錄進行的加減等“四

關於對映語句集合不包含com.itheima.ssm.IMemberDao.findById的值的異常

異常中文翻譯如下: 查詢資料庫時出錯。原因:. lang。對映語句集合不包含com.itheima.ssm.IMemberDao.findById的值 這個錯誤可能存在於com/itheima/ssm/dao/ITravellerDao中。java(猜測) 這個錯誤可能涉及com.itheima.s

4-7 集合

1、集合天生可以去重 1 # 集合天生就可以去重 2 l = [1,2,2,1,4,5] 3 lset = set(l) 4 print(lset) # {1, 2, 4, 5}   2、交集 1 # 集合是無序的 2 stus1 = {'胡紹燕','王義','王新','馬

Mybatis3.1-[tp_32-33]-_對映檔案_select_resultMap關聯查詢_association分步查詢_延遲載入

筆記要點出錯分析與總結 工程組織 1.定義介面   DepartmentMapper package com.dao; import com.bean.Department; public interface DepartmentMapper { pub

Hibernate(5.3.7關聯關係中的反轉和級聯

1、反轉: 反轉操作在對映檔案中通過對集合的inverse屬性設定,來控制關聯關係和物件的級聯關係。 inverse預設為false,關係的兩端都能夠控制,但會造成更新時出現重複更新的情況,產生多餘的SQL語句。所以在實際開發中,一對多的時候,將一的一方inverse設定為true,

MyBatis總結(二十二)--MyBatis_對映檔案_select_resultMap_關聯查詢_association定義關聯物件封裝規則

本文介紹了association的基本使用方法下面就是具體的程式碼 Junit程式碼 @Test public void test05() throws IOException{ SqlSessionFactory sqlSessionFactor