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

Christy
appxtech
Published in
Feb 21, 2022

在前二篇 資料庫初體驗的內容裏,我們使用了Spring Data裏內建的CrudRepository (*有需要前情提要的各位,可以點這裏)。針對常見的簡易結構,相信是很容易使用,但是如果要存入的資料可能稍微有點複雜或是說需要跟別的資料表(table)互相關聯(Reference/Join)的時候,那該怎麼辦呢?!

今天的這篇就讓我們來看看,要如何透過Spring Data來達到所謂一對一關聯的結構(One-To-One Relationship Model)。

開始之前,先稍微說明一下應用的情境 ~

延續之前寫好的MyUser,現在客戶希望能導入分店的概念,每個會員都必需歸屬於某家分店的意思。

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

步驟一

建立一個新的Java類別(class),來代表分店如下:

步驟二

MyUser裏面加上對應的商店參考欄位及對應的標籤,如下圖:

而在MyStore 裏也要記得加上對應的標籤,如下圖:

步驟三

最後在Controller的函式裏,將MyUser及MyStore建立起關聯,如下圖:

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

MyUser 清單的結果:

YES ~ 新寫入的 User記錄「F test」就有搭配到MyStore_ID欄位的值。

讓我們來看MyStore 清單的結果:

YES ~ 果然在新增MyUser的資料時會連同將店家的資料存進到MyStore的資料表(table)裏,並且會自動設定好關聯的欄位值(欄位名: MyStore_Id),在這個例子也就是 1。

從這個簡單例子,我們可以看出Spring Data在處理One-To-One (1對1)的資料表結構時,很輕易地讓工程師可以透過標籤來達到效果,並不用像以往老派(old school)的方式,來下SQL Join語法,而重要的是我們傳入複合物件,然後資料就可以分別地寫到對應的table,這也是ORM的好處,讓我們專心用物件來運作而不用擔心SQL的撰寫。

總結

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

● javax.persistence @OneToOne

● javax.persistence @JoinColumn

透過Spring Core所提供的核心標籤 @ OneToOne可以設定是要用哪個物件搭配哪個欄位的名稱來對應,而@JoinColumn則是設定目的地,是哪個table的哪個欄位。格式 : 資料表名稱_key欄位名稱,如 mystore_id

這篇,我們就先介紹 1對1的用法,下面二篇會分別介紹常見1對多,以及 多對多的關聯式寫法 ~

敬請各位期待囉 ~ 我們下週見!

練習

請試著依上述例子,加上 查詢的功能 ~
讓API查詢使用者資料時,能一併回傳MyUser及MyStore的分店資訊

--

--