Spring Data JPA實踐與學習(九)

2021-10-10 21:34:09 字數 2878 閱讀 2738

實體與實體之間的關聯關係一共分為四種,分別為onetoone、onetomany、manytoone 和 manytomany;而實體之間的關聯關係又分為雙向的和單向的。實體之間的關聯關係是在 jpa 使用中最容易發生問題的地方。

@entity

@data

@builder

@allargsconstructor

@noargsconstructor

public

class

user

user 實體裡面什麼都沒變化,不需要新增 @onetoone 註解。我們只需要在擁有外來鍵的一方配置就可以,所以 userinfo 的**如下:

@entity

@data

@builder

@allargsconstructor

@noargsconstructor

@tostring

(exclude =

"user"

)public

class

userinfo

上面試單項關聯關係,那麼雙向關聯應該怎麼配置呢?我們保持 userinfo 不變,在 user 實體物件裡面新增這一段**即可。

@onetoone

"user"

)private userinfo userinfo;

@inte***ce onetoone 原始碼解讀

public @inte***ce

onetoone

;//資料獲取方式eager(立即載入)/lazy(延遲載入)

fetchtype fetch()

default eager;

//是否允許為空,預設是可選的,也就表示可以為空;

boolean

optional()

default

true

;//關聯關係被誰維護的一方物件裡面的屬性名字。 雙向關聯的時候必填()

default"";

//當被標識的字段發生刪除或者置空操作之後,是否同步到關聯關係的一方,即進行通過刪除操作,預設flase,注意與cascadetype.remove 級聯刪除的區別

boolean

orphanremoval()

default

false

;}

cascadetype用法

在 cascadetype 的用法中,cascadetype 的列舉值只有五個,分別如下:

1、cascadetype.persist 級聯新建

2、cascadetype.remove 級聯刪除

3、cascadetype.refresh 級聯重新整理

4、cascadetype.merge 級聯更新

5、cascadetype.all 四項全選

jpa 2.0 還新增了 cascadetype.detach,即級聯實體到 detach 狀態。

orphanremoval 屬性用法

orphanremoval 表示當關聯關係被刪除的時候,是否應用級聯刪除,預設 false。

public @inte***ce

manytoone

; fetchtype fetch()

default eager;

boolean

optional()

default

true;}

public @inte***ce

onetomany

;//資料獲取方式eager(立即載入)/lazy(延遲載入)

fetchtype fetch()

default lazy;

//關係被誰維護,單項的。注意:只有關係維護方才能操作兩者的關係。()

default"";

//是否級聯刪除。和cascadetype.remove的效果一樣。兩種配置了乙個就會自動級聯刪除

boolean

orphanremoval()

default

false

;}

我們看到上面的字段和 @onetoone 裡面的基本一樣,用法是一樣的,不過需要注意以下幾點:

@manytoone 的 lazy 機制和用法,與 @onetoone 的一樣,@manytoone 和 @onetomany 的最佳實踐,與 @onetoone 的完全一樣,也是盡量避免雙向關聯,一切級聯更新和 orphanremoval 都保持預設規則,並且 fetch 採用 lazy 延遲載入。

@manytomany 代表多對多的關聯關係,這種關聯關係任何一方都可以維護關聯關係。當用到 @manytomany 的時候一定是三張表,不要想著建兩張表,兩張表肯定是違背表的設計原則的。

那麼我們看下 @manytomany 的語法。

public @inte***ce

manytomany

; fetchtype fetch()

default lazy;()

default"";

}

基本上和其他的相同,@onetomany 的最佳實踐同樣適用,一般是在中間表物件裡面做單向關聯,這樣會讓實體之間的關聯關係簡單很多。

與 @onetomany 一樣的道理,不要用級聯刪除和 orphanremoval=true。

fetchtype 採用預設方式:fetch = fetchtype.lazy 的方式。

Spring Data JPA實踐與學習(四)

spring data jpa 為了方便我們排序和分頁,支援了兩個特殊型別的引數 sort 和 pageable。sort 在查詢的時候可以實現動態排序,我們看下其原始碼 public sort direction direction,string.properties sort 裡面決定了我們哪些...

spring data jpa實體繼承

spring jpa中我們要將sql對映到物件,尤其是在spring boot這種高度自動化的環境下使用,大量的最優目錄結構與命名規則可以大大降低配置,約定大於配置貫穿其中。例如我們定義查詢dao,繼承jparepository即可。然後返回的物件,我們可以定義model entity table ...

SpringData JPA分頁查詢

首先我們需要知道springdata jpa 的幾個介面 其實看名字就大概懂了,也可以很方便的使用 首先我們的持久化層繼承jparepository,相當於繼承了增刪改查的持久化層以及分頁查詢的持久化層 所以如果我們要使用分頁查詢 我們只需要直接呼叫 由一開始的圖也可以看到pageable的其中乙個...