最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring JPA聯(lián)表查詢之OneToMany源碼解析

 更新時間:2023年04月28日 14:51:06   作者:煙雨戲江南  
這篇文章主要為大家介紹了Spring JPA聯(lián)表查詢之OneToMany源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

我們在實際項目中,除了會碰到一對一的情況,還有一對多的情況,比如一個用戶可以有多輛車,而一輛車只能有一個用戶等等,今天我們就來一起學習下 OneToMany(一對多)。

源碼

@OneToMany 注解實現(xiàn)一對多關系映射。比如用戶跟房子的關系, 一個用戶可以有好多房子,而一個房子只能一個用戶。
老規(guī)矩,實例之前先看看源碼:

public @interface OneToMany {
    Class targetEntity() default void.class;
    CascadeType[] cascade() default {};
    FetchType fetch() default LAZY;
    String mappedBy() default "";
    boolean orphanRemoval() default false;
}

注解屬性詳情請見 注解屬性詳解,其中需要注意的是 @OneToManyfetch 的默認值是 LAZY。

單向聯(lián)表

我這里所說的單向聯(lián)表就是只有一方添加注解;通俗講就是我可以通過 user 獲取到其 house 的信息,而不同通過 house 獲取到其 user 的信息。

user 實體類

因為對方是 many 多端,所以這邊需要用 List 集合

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private int age;
    @OneToMany
    @JoinColumn(name = "user_id")
    private List<House> house;
}

house 實體類

@Entity
@Data
public class House {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String addr;
}

小貼士

實例運行之后,大家肯定會發(fā)現(xiàn)一個奇怪的問題:user_id 字段明明寫在了 user 實體類中,但是實際卻添加在 house 表中,這是為啥呢?
因為在 JPA 規(guī)范中,一對多的雙向關系是由 多端(many) 來維護。就是說 多端(many) 為關系維護端,負責關系的增刪改查;一端(one) 則為關系被維護端。

執(zhí)行請求/user/findById?id=1,控制臺打印如下:

Hibernate: 
    select
        user0_.id as id1_2_0_,
        user0_.age as age2_2_0_,
        user0_.name as name3_2_0_ 
    from
        user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        house0_.user_id as user_id3_1_0_,
        house0_.id as id1_1_0_,
        house0_.id as id1_1_1_,
        house0_.addr as addr2_1_1_ 
    from
        house house0_ 
    where
        house0_.user_id=?

查詢結(jié)果

User(id=1, name=lili, age=11, house=[House(id=1, addr=江蘇南京), House(id=2, addr=江蘇無錫), House(id=3, addr=江蘇蘇州)])

雙向聯(lián)表

我們除了需要通過 user 信息來獲取其 house 信息外,有時還需要通過 house 信息來獲取其 user 信息。但是需要注意的是 user 對于 house 來說,是一對多;而 house 對于 user 來說,是多對一。這時我們就需要引入另一個聯(lián)表注解 @ManyToOne,在 house 的實體中添加 user 字段,并添加 @ManyToOne 注解。(這里有一個堆棧溢出的問題需要注意一下,詳情請見 JPA 錯題集 第二個報錯信息)

user 實體類

user 實體中 house 字段

@OneToMany
@JoinColumn(name = "user_id")
@JsonIgnore
public List&lt;House&gt; house;

house 實體類

@ManyToOne
@JsonIgnore
private User user;

執(zhí)行請求 /house/findById?id=1,控制臺打印如下:

Hibernate: 
    select
        house0_.id as id1_1_0_,
        house0_.addr as addr2_1_0_,
        house0_.user_id as user_id3_1_0_,
        user1_.id as id1_2_1_,
        user1_.age as age2_2_1_,
        user1_.name as name3_2_1_ 
    from
        house house0_ 
    left outer join
        user user1_ 
            on house0_.user_id=user1_.id 
    where
        house0_.id=?
2023-04-27 20:35:29.940 TRACE 24272 --- [nio-7777-exec-6] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]

對象獲取

有同學可能已經(jīng)發(fā)現(xiàn)了,當添加了 @JsonIgnore 這個屬性之后
執(zhí)行請求 /user/findById?id=1,控制臺打印如下:

Hibernate: 
    select
        user0_.id as id1_2_0_,
        user0_.age as age2_2_0_,
        user0_.name as name3_2_0_ 
    from
        user user0_ 
    where
        user0_.id=?
[nio-7777-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]

只取進行用戶信息的查詢,那我的 house 怎么辦呢?別急,我會給你們找回來的!
Usercontrol

@GetMapping("findById")
public Optional<User> findById(int id){
    Optional<User> users = userService.findById(id);
    users.get().getHouse().forEach(v->{
        System.out.println(v.getId() + "-"+ v.getAddr());
    });
    return userService.findById(id);
}

執(zhí)行請求 /user/findById?id=1,控制臺打印如下:

Hibernate: 
    select
        house0_.user_id as user_id3_1_0_,
        house0_.id as id1_1_0_,
        house0_.id as id1_1_1_,
        house0_.addr as addr2_1_1_,
        house0_.user_id as user_id3_1_1_ 
    from
        house house0_ 
    where
        house0_.user_id=?
[nio-7777-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [1]
1-南京
2-蘇州
3-無錫

以上就是Spring JPA聯(lián)表查詢之OneToMany源碼解析的詳細內(nèi)容,更多關于Spring JPA聯(lián)表查詢OneToMany的資料請關注腳本之家其它相關文章!

相關文章

  • java中的tostring方法的具體用法

    java中的tostring方法的具體用法

    這篇文章主要介紹了java中的tostring方法的具體用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起學習一下吧
    2019-06-06
  • Spring Boot如何讀取自定義外部屬性詳解

    Spring Boot如何讀取自定義外部屬性詳解

    這篇文章主要給大家介紹了關于Spring Boot如何讀取自定義外部屬性的相關資料,這個功能實現(xiàn)介紹的很詳細,需要的朋友可以參考下
    2021-05-05
  • 怎樣使用PowerMockito 測試靜態(tài)方法

    怎樣使用PowerMockito 測試靜態(tài)方法

    這篇文章主要介紹了使用PowerMockito 測試靜態(tài)的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot集成Thymeleaf的方法

    Spring Boot集成Thymeleaf的方法

    這篇文章主要介紹了Spring Boot集成Thymeleaf的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java中Cookie和Session詳解及區(qū)別總結(jié)

    Java中Cookie和Session詳解及區(qū)別總結(jié)

    這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Java中RocketMQ的流量削峰詳解

    Java中RocketMQ的流量削峰詳解

    這篇文章主要介紹了Java中RocketMQ的流量削峰詳解,MQ的主要特點為解耦、異步、削峰,該文章主要記錄與分享個人在實際項目中的RocketMQ削峰用法,用于減少數(shù)據(jù)庫壓力的業(yè)務場景,需要的朋友可以參考下
    2023-09-09
  • SpringBoot使用JdbcTemplate操作數(shù)據(jù)庫

    SpringBoot使用JdbcTemplate操作數(shù)據(jù)庫

    這篇文章主要介紹了SpringBoot使用JdbcTemplate操作數(shù)據(jù)庫,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • JavaWeb文件上傳開發(fā)實例

    JavaWeb文件上傳開發(fā)實例

    這篇文章主要為大家詳細介紹了JavaWeb文件上傳開發(fā)實例,如何進行文件上傳操作,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java正則表達式API Matcher類方法

    Java正則表達式API Matcher類方法

    這篇文章主要介紹了Java正則表達式API Matcher類方法,對Matcher類的一些有用方法進行功能對它們進行分組展開介紹,需要的朋友可以參考一下
    2022-06-06
  • ES多條件查詢寫法舉例

    ES多條件查詢寫法舉例

    這篇文章主要給大家介紹了關于ES多條件查詢的相關資料,Elasticsearch多條件查詢是指在查詢數(shù)據(jù)時,可以同時使用多個條件來篩選數(shù)據(jù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11

最新評論

红桥区| 张北县| 达日县| 余干县| 岗巴县| 门源| 临猗县| 大兴区| 东台市| 林口县| 南安市| 巴林右旗| 怀来县| 洱源县| 资中县| 凤凰县| 江油市| 云安县| 虹口区| 呼和浩特市| 玛纳斯县| 库尔勒市| 湖北省| 萨迦县| 定陶县| 黑河市| 瓮安县| 乌拉特后旗| 柏乡县| 方城县| 拜城县| 湘潭县| 台南市| 池州市| 沙湾县| 九台市| 舞钢市| 乳源| 南陵县| 韶山市| 永寿县|