今天由于時(shí)間的關(guān)系自赔,我們就簡單的介紹下Spring Data JPA中常見的關(guān)系映射~赢底!
首先我們先建立一個(gè)實(shí)體類Book類,然后在這個(gè)Book里面添加id后控,name庙曙,category變量,并生成他們的get和set方法浩淘。
由于一本書可以屬于多個(gè)門類捌朴,所以category對(duì)應(yīng)book的話應(yīng)該是ManyToOne的關(guān)系所以我們?cè)谧兞縞ategory前加個(gè)ManyToOne這個(gè)注解,來說明book和category的關(guān)系。
然后我們來運(yùn)行一下程序在看看數(shù)據(jù)庫张抄!
然后我們可以看見數(shù)據(jù)庫中book實(shí)體類所對(duì)應(yīng)的邊xhysc_book里面生成了一個(gè)xhysc_category_xhysc_id這個(gè)外鍵砂蔽。
然后我們?cè)倏纯碿ategory實(shí)體類所對(duì)應(yīng)的邊xhysc_category中并沒有生成外鍵,所以這就證明這是一個(gè)單行連接署惯,也就是我們可以根據(jù)book查詢到它所對(duì)應(yīng)的category左驾,而無法在category中找到category所以關(guān)聯(lián)的book!
接下來我們來實(shí)現(xiàn)ManyToOne中的雙向關(guān)系极谊!
很簡單诡右,我們只需要在category實(shí)體類中說明一個(gè)類型為book的List集合,然后為它添加注解@OneToMany轻猖,因?yàn)閎ook對(duì)應(yīng)category為ManyToOne帆吻,所以category對(duì)應(yīng)book應(yīng)該為OneToMany!
然后我們運(yùn)行程序咙边,查看我們數(shù)據(jù)庫猜煮,發(fā)現(xiàn)數(shù)據(jù)庫多出了一張表,表名為xhysc_xhysc_category_xhysc_book败许,里面有兩個(gè)字段分別為xhysc_category_xhysc_id和xhysc_books_xhysc_id王带,其實(shí)是因?yàn)槌绦蜃詣?dòng)新建了一張表把book實(shí)體類和category實(shí)體類所對(duì)應(yīng)的數(shù)據(jù)庫邊的主鍵id關(guān)聯(lián)了起來!
但是這貌似并不是我們想要的結(jié)果市殷,這因?yàn)槲覀儍蓚€(gè)實(shí)體類都說明了映射關(guān)系愕撰,他們就各自維護(hù)了自己的關(guān)系。所以我們要在Category實(shí)體類中books變量的注解后面加上@OneToMany(mappedBy = "category"),意思就是我們的關(guān)系維護(hù)不再有我們的單方Category實(shí)體類來維護(hù)盟戏,而是由我們的多方Book實(shí)體類來維護(hù)绪妹!
然后我們?cè)谶\(yùn)行程序甥桂,查看我們的數(shù)據(jù)庫柿究!
最終我們看到了我們想要的結(jié)果,就是book實(shí)體類對(duì)應(yīng)的數(shù)據(jù)庫邊生成了category實(shí)體類表的外鍵黄选,實(shí)現(xiàn)了一本書對(duì)應(yīng)一個(gè)門類蝇摸,但是一個(gè)門類卻可以對(duì)應(yīng)多本書這個(gè)需求。
最后附件一個(gè)小實(shí)踐办陷,就我們對(duì)應(yīng)多方的實(shí)體類注解@ManyToOne后可以添加一些控制貌夕!
fetch是控制我們?cè)诓樵僢ook類的時(shí)候時(shí)候把當(dāng)前book類下的category也查詢出來,其中這里有兩個(gè)策略民镜,一個(gè)是EAGER也就是馬上加載啡专,一個(gè)是LAZY也就是不加載的方式。而默認(rèn)的方式是為EAGER制圈!
optional是表示我們的外鍵是否可以為空们童,默認(rèn)的選項(xiàng)是true的,在沒有聲明optional下鲸鹦,我們的書是可以不屬于任何一個(gè)門類的慧库。
而在我們OneToMany這方也有幾個(gè)屬性可以選擇的!例如cascade =CascadeType.REMOVE表示的就是當(dāng)我們刪除這個(gè)門類的時(shí)候馋嗜,它時(shí)候也會(huì)把book中剩余這個(gè)門類的信息刪除齐板!
orphanRemoval = true表示當(dāng)我們操作集合的時(shí)候使用集合中的removed方法removed一個(gè)元素的時(shí)候是否同步數(shù)據(jù)庫把數(shù)據(jù)庫中的信息也刪除了!
targetEntity是操作泛型的由于用得比較少葛菇,這里就不一一解析了啦甘磨!
今天就講到這里啦~~~!