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

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

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

前言

我們?cè)趯?shí)際項(xiàng)目中,除了會(huì)碰到一對(duì)一的情況,還有一對(duì)多的情況,比如一個(gè)用戶可以有多輛車,而一輛車只能有一個(gè)用戶等等,今天我們就來(lái)一起學(xué)習(xí)下 OneToMany(一對(duì)多)。

源碼

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

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

注解屬性詳情請(qǐng)見 注解屬性詳解,其中需要注意的是 @OneToManyfetch 的默認(rèn)值是 LAZY。

單向聯(lián)表

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

user 實(shí)體類

因?yàn)閷?duì)方是 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 實(shí)體類

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

小貼士

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

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

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=江蘇無(wú)錫), House(id=3, addr=江蘇蘇州)])

雙向聯(lián)表

我們除了需要通過(guò) user 信息來(lái)獲取其 house 信息外,有時(shí)還需要通過(guò) house 信息來(lái)獲取其 user 信息。但是需要注意的是 user 對(duì)于 house 來(lái)說(shuō),是一對(duì)多;而 house 對(duì)于 user 來(lái)說(shuō),是多對(duì)一。這時(shí)我們就需要引入另一個(gè)聯(lián)表注解 @ManyToOne,在 house 的實(shí)體中添加 user 字段,并添加 @ManyToOne 注解。(這里有一個(gè)堆棧溢出的問(wèn)題需要注意一下,詳情請(qǐng)見 JPA 錯(cuò)題集 第二個(gè)報(bào)錯(cuò)信息)

user 實(shí)體類

user 實(shí)體中 house 字段

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

house 實(shí)體類

@ManyToOne
@JsonIgnore
private User user;

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

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]

對(duì)象獲取

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

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]

只取進(jìn)行用戶信息的查詢,那我的 house 怎么辦呢?別急,我會(huì)給你們找回來(lái)的!
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í)行請(qǐng)求 /user/findById?id=1,控制臺(tái)打印如下:

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-無(wú)錫

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

相關(guān)文章

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

    java中的tostring方法的具體用法

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

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

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

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

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

    Spring Boot集成Thymeleaf的方法

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

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

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

    Java中RocketMQ的流量削峰詳解

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

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

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

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

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

    Java正則表達(dá)式API Matcher類方法

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

    ES多條件查詢寫法舉例

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

最新評(píng)論

收藏| 建瓯市| 获嘉县| 玛曲县| 托克逊县| 岳普湖县| 信宜市| 隆昌县| 平原县| 库尔勒市| 甘泉县| 莲花县| 塔河县| 玛曲县| 丰县| 庄浪县| 漯河市| 阿勒泰市| 社旗县| 佛坪县| 常熟市| 滨州市| 筠连县| 塘沽区| 抚松县| 衡阳市| 甘肃省| 沭阳县| 杨浦区| 吉安市| 舞钢市| 邵阳县| 灵山县| 凤冈县| 江达县| 桃园县| 斗六市| 且末县| 景泰县| 玛曲县| 千阳县|