Spring 5 (含 Spring MVC) 新手村起手式 — 資料庫存取之 多對多模型 (Many-To-Many Relationship)

Christy
appxtech
Published in
Apr 20, 2022

在上一篇 資料庫1對多關係 裏,我們使用了Spring Data裏內建的OneToMany 標籤。今天這篇,我們就接著來看另一個很常見的標籤 ManyToMany。

在開始寫程式之前,我們先稍微說明一下需求情境,可以讓大家在面對後續的技術內容時能更有方向的前進以及有效地的消化。

需求情境,可以想像在一個學校的環境裏,在剛開學的時期,大家都會需要註冊課程以滿足畢業學分要求。
所以我們就以下列二項主要需求來進行:

一、每張學生可以報名一個或多個課程

二、而同一個課程可以讓多名學生報名

接著就來看詳細的步驟吧 ~

|步驟一二三|

一、建立一個新的Java類別(class),來代表學生,如下:

Line 14~16行 在學生的模型上,加上Primary Key(主鍵)的標籤 @Id, @GeneratedValue,讓系統自動遞增數值。

Line 20~18行 針對學生類別跟課程的關係,使用@ManyToMany來建立多對多的關係並且搭配 @JoinTable來設定 記錄關係的資料表,而joinColumns是設定Master table的欄位(*主要來源- 也就是學生資料表的PK欄位),inverseJoinColumns則是設定 Detail table裏,對應的欄位(也就是課程資料表裏對應反查的欄位)。

二、新增課程的類別,如下圖:

Line 14~16行 在課程的模型上,像上述的學生模型一樣,也加上Primary Key(主鍵)的標籤 @Id,@GeneratedValue,讓系統自動遞增數值。

Line 20~18行 針對學生類別跟課程的關係,使用@ManyToMany來建立多對多的關係並且搭配 @JoinTable來設定 記錄關係的資料表,而joinColumns是設定Master table的欄位(*主要來源- 也就是學生資料表的PK欄位),inverseJoinColumns則是設定 Detail table裏,對應的欄位(也就是課程資料表裏對應反查的欄位)。

三、一、準備Repository類別以及程式的進入點。我們可以透過在Controller的函式裏,將學生Student及 課程Course 的物件透過相關函式依照之前宣告建立關係,實作如下圖:

接著啟動專案,透過內建的H2 Console可以來檢視結果~

在開啟頁面之前,先檢查DB Tables的狀態→

可以看到,會建立 Course,Student 以及Course_Student_Mapping 等 三張資料表。如下圖:

Course資料表的內容:

Student 資料表的內容:

接著讓我們來執行程式,用Browser來呼叫 HelloController來執行寫入資料的動作後,從Course_Student_Mapping 資料表看來,可以看到有一筆資料 Student_ID 為2,Course_ID為3:

YES ~ 這張資料表裏面就顯示出剛新增的學生 ID以及已註冊的課程ID 記錄。

透過這個例子,我們可以看出Spring Data在處理Many-To-Many (多對多)的資料表結構時,也跟上次One-To-Many(1對1)的方式類似,只不過中間多了一個 Mapping Table 來記錄多對多的關係。

看到這邊, Spring Data 最常見的情境就像這幾篇所整理的,從 1對1,1對多,到這篇多對多 相信對日常生活的需求應該已經很足夠~

總結

在這次的範例裏,我們有使用以下的標籤 annotation

● javax.persistence @ManyToMany

● javax.persistence @JoinTable

透過Spring Core所提供的核心標籤 @ManyToMany可以設定是要用哪些類別來對應多對多的關係,搭配著@JoinTable以及相關的屬性來指定要如何建立關聯。

完整的範例程式碼…等待各位留言來索取好了 ~
當做對我們程式創作者的鼓勵囉 XD

下週,我們來看在程式裏,多次出現的CrudRepository相關的資訊以及應用小技巧喔 ~ 下週見

練習

一、上述的範例,是從學生的角度來讀取相關的課程記錄,
可以試試看,能否從一個課程的角度來把所有註冊的學生資料帶出。

--

--