亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

源碼

@OneToMany 注解實現(xiàn)一對多關(guān)系映射。比如用戶跟房子的關(guā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ī)范中,一對多的雙向關(guān)系是由 多端(many) 來維護。就是說 多端(many) 為關(guān)系維護端,負責關(guān)系的增刪改查;一端(one) 則為關(guān)系被維護端。

執(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)容,更多關(guān)于Spring JPA聯(lián)表查詢OneToMany的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏詳解

    Java利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏詳解

    在項目中有些敏感信息不能直接展示,比如客戶手機號、身份證、車牌號等信息,展示時均需要進行數(shù)據(jù)脫敏,防止泄露客戶隱私。本文將利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏,需要的可以參考一下
    2023-03-03
  • Java編碼輔助工具Mapstruct用法詳解

    Java編碼輔助工具Mapstruct用法詳解

    這篇文章主要介紹了Java編碼輔助工具Mapstruct用法詳解,手動編碼setter/getter各個對應(yīng)屬性,會顯得臃腫繁瑣。通過Mapstruct框架可簡單方便地完成這一工作。,需要的朋友可以參考下
    2019-06-06
  • Spring(AbstractRoutingDataSource)實現(xiàn)動態(tài)數(shù)據(jù)源切換示例

    Spring(AbstractRoutingDataSource)實現(xiàn)動態(tài)數(shù)據(jù)源切換示例

    本篇文章主要介紹了詳解Spring(AbstractRoutingDataSource)實現(xiàn)動態(tài)數(shù)據(jù)源切換,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • JDK?8和JDK?17的區(qū)別和新特性大全

    JDK?8和JDK?17的區(qū)別和新特性大全

    這篇文章主要給大家介紹了關(guān)于JDK?8和JDK?17的區(qū)別和新特性的相關(guān)資料,文中總結(jié)一些Jdk8到Jdk17的一些新特性,給大家選擇jdk版本的時候有些參考性,需要的朋友可以參考下
    2023-06-06
  • 解決Java處理HTTP請求超時的問題

    解決Java處理HTTP請求超時的問題

    這篇文章主要介紹了解決Java處理HTTP請求超時的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Java線程池源碼的深度解析

    Java線程池源碼的深度解析

    線程池的好處和使用本篇文章就不贅敘了,這篇文章主要通過線程池的源碼帶大家深入了解一下jdk8中線程池的實現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10
  • 使用IDEA畫UML圖的詳細步驟

    使用IDEA畫UML圖的詳細步驟

    UML是面向?qū)ο笤O(shè)計的建模工具,獨立于任何具體程序設(shè)計語言,是一種為面向?qū)ο笙到y(tǒng)的產(chǎn)品進行說明、可視化和編制文檔的一種標準語言,本文重點給大家介紹使用IDEA畫UML圖的詳細步驟,需要的朋友參考下吧
    2021-06-06
  • Java中方法重寫與重載的區(qū)別

    Java中方法重寫與重載的區(qū)別

    大家好,本篇文章主要講的是Java中方法重寫與重載的區(qū)別,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • java實現(xiàn)支付寶支付接口的調(diào)用

    java實現(xiàn)支付寶支付接口的調(diào)用

    本文主要介紹了java實現(xiàn)支付寶支付接口的調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • SpringBoot中使用Knife4J的解決方案

    SpringBoot中使用Knife4J的解決方案

    knife4j是為Java?MVC框架集成Swagger生成Api文檔的增強解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J,需要的朋友可以參考下
    2022-10-10

最新評論