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

SpringDataJPA實體類關系映射配置方式

 更新時間:2021年12月06日 10:14:47   作者:墻角斑駁  
這篇文章主要介紹了SpringDataJPA實體類關系映射配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringDataJPA

//FetchType.LAZY:懶加載,加載一個實體時,定義懶加載的屬性不會馬上從數(shù)據(jù)庫中加載
//FetchType.EAGER:急加載,加載一個實體時,定義急加載的屬性會立即從數(shù)據(jù)庫中加載
//cascade = CascadeType.ALL 表示所有情況下均進行關聯(lián)操作,即save-update和delete
@JsonBackReference   //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內容大,不加載
//雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值

1.單向一對一映射

一方

  //教師
  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
  private int id;
  private String name;
  private long salary;
  @OneToOne 
  @JoinColumn(name="PSPACE_ID") 
  private ParkingSpace parkingSpace;

一方

    //停車場
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private int lot;
    private String location;

總結

添加時候需要先添加@OneToOne的那方,刪除也是。

2.雙向一對一映射

一方

  //人員
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private long id;
  private String name;
  @OneToOne
  @JoinColumn(name="DEPT_ID")
  @JsonIgnoreProperties(value = "person")
  private Department department;

一方

  //部門
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private long id;
  private String name;
  @OneToOne(mappedBy="department")
  @JsonIgnoreProperties(value = "department")
  private Person person;

總結

@JsonBackReference   //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內容大,不加載
//雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值

3.單向一對多映射

一方

    @Id
    @GeneratedValue
    private Long id;
    @Column(length = 32)
    private String name;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)//級聯(lián)保存、更新、刪除、刷新;延遲加載
    @JoinColumn(name = "author_id")//在book表增加一個外鍵列來實現(xiàn)一對多的單向關聯(lián)
    private Set<Book> books = new HashSet<Book>();

多方

    //單向一對多的情況下  多方不需要加任何關聯(lián)標識
 @Id
    @GeneratedValue
    private Long id;
    @Column(length=32)
    private String name;

總結

因為是單向的關聯(lián),多方不需要加任何的關聯(lián)標識 只需要在一方添加即可

4.雙向一對多映射

一方

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; //主鍵
    private String name; //姓名
    //描述客戶可以有多個訂單
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Order> order = new HashSet<Order>();

多方

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private Double money;
    private String receiverInfo; //收貨地址
    // 訂單與客戶關聯(lián)
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "c_id") //指定外鍵列  
    @JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內容大,不加載
    private Customer customer; //描述訂單屬于某一個客戶

總結

@JsonBackReference   //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內容大,不加載
//雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值

5.單向多對一映射

多方

 @GeneratedValue
 @Id
 private Integer id;
 @Column(name="ORDER_NAME")
 private String orderName;
 //映射單向 n-1的關聯(lián)關系
 //使用@ManyToOne來映射多對一的關聯(lián)關系
 //使用@JoinColumn 來映射外鍵
 //可使用 @ManyToOne 的fetch 屬性來修改默認的關聯(lián)屬性的加載策略
 @JoinColumn(name="CUSTOMER_ID")  //此外鍵為一方的主鍵
 @ManyToOne(fetch=FetchType.EAGER)
 private Customer customer;

一方

    //單向多對一的情況下,一方不需要加任何關聯(lián)標識
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Integer id;
    private String lastName;
    private String email;
    private int age;
    private Date createdTime;
    private Date birth;

總結

保存多對一時,建議先保存1的一端,后保存n的一端,這樣不會多出額外的update語句。

6.雙向多對一映射

多方

 @GeneratedValue
 @Id
 private Integer id;
 @Column(name="ORDER_NAME")
 private String orderName;
 //映射單向 n-1的關聯(lián)關系
 //使用@ManyToOne來映射多對一的關聯(lián)關系
 //使用@JoinColumn 來映射外鍵
 //可使用 @ManyToOne 的fetch 屬性來修改默認的關聯(lián)屬性的加載策略
 @JoinColumn(name="CUSTOMER_ID")
 @ManyToOne(fetch=FetchType.EAGER)
 @JsonIgnoreProperties(value = {"customer","orders"})
 private Customer customer;

一方

    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name="LAST_NAME",length=50,nullable=false)
    private String lastName;
    private String email;
    private int age;
    //定義日期格式
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdTime;
    @Temporal(TemporalType.DATE)
    private Date birth;
    //映射單向1-n的關聯(lián)關系
    //使用@OneToMany 映射單向1-n的關聯(lián)關系
    //使用@JoinColumn 來映射外鍵的名稱
    //可以使用@OneToMany 的 fetch 屬性來修改加載策略
    //可以使用@OneToMany 的 cascade 屬性來修改默認的刪除策略
//    @JoinColumn(name="CUSTOMER_ID")
    //一的一端放棄維持關聯(lián)關系
    @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mappedBy="customer")
    @JsonIgnoreProperties(value = "orders")
    private Set<Order> orders = new HashSet<>();

總結

1.必須使用@JsonIgnoreProperties注解來攔截轉json時無限遞歸的問題

2.若是雙向 1-n 的關聯(lián)關系, 執(zhí)行保存時:

(1)若先保存 n 的一端, 再保存 1 的一端, 默認情況下, 會多出2n 條 UPDATE 語句;

(2)若先保存 1 的一端, 則會多出 n 條 UPDATE 語句。

(3)故在進行雙向 1-n 關聯(lián)關系時, 建議使用 n 的一方來維護關聯(lián)關系, 而 1 的一方不維護關聯(lián)系, 這樣會有效的減少 SQL 語句(即,N的一端對應的表中使用外鍵關聯(lián)1的一端,外鍵對應1的一端的表主鍵)

注意:若在 1 的一端的 @OneToMany 中使用 mappedBy 屬性, 則 @OneToMany 端就不能再使用 @JoinColumn 屬性了。

7.單向多對多映射

多方

   @Id
    @GeneratedValue
    private Long id;
    private String name;
    // 表示多對多
    @ManyToMany(cascade = CascadeType.ALL)
    // 中間表的表名
    @JoinTable(name = "t_user_role", joinColumns = {@JoinColumn(name = "user_id")},
            //反轉  user這個表的 反面則是 role
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    private Set<Role> roles = new HashSet<>();

多方

    @Id
    @GeneratedValue
    private Long id;
    private String name;

總結

使用 @JoinTable 來映射中間表

1. name 指向中間表的名字

2. joinColumns 映射當前類所在的表在中間表中的外鍵

2.1 name 指定外鍵列的列名

2.2 referencedColumnName 指定外鍵列關聯(lián)當前表的哪一列

3. inverseJoinColumns 映射關聯(lián)的類所在中間表的外鍵

8.雙向多對多映射

多方

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    // 表示多對多
    @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
            inverseJoinColumns ={@JoinColumn(name="role_id")} )
    @JsonIgnoreProperties(value = "users")
    private Set<Role> roles = new HashSet<>()

多方

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},
            inverseJoinColumns ={@JoinColumn(name="user_id")} )
    @JsonIgnoreProperties(value = "roles")
    private Set<User> users = new HashSet<>();

總結

使用 @JoinTable 來映射中間表

1. name 指向中間表的名字

2. joinColumns 映射當前類所在的表在中間表中的外鍵

2.1 name 指定外鍵列的列名

2.2 referencedColumnName 指定外鍵列關聯(lián)當前表的哪一列

3. inverseJoinColumns 映射關聯(lián)的類所在中間表的外鍵

@JsonBackReference //解決循環(huán)引用問題
@JsonIgnoreProperties(value = "order") //解決循環(huán)引用問題,order內容大,不加載

雙向映射存在轉json無限遞歸問題 需要注解來處理 推薦使用第二個注解 value值為對方表作映射的變量值

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 微信公眾號開發(fā)之回復圖文消息java代碼

    微信公眾號開發(fā)之回復圖文消息java代碼

    這篇文章主要為大家詳細介紹了微信公眾號開發(fā)之回復圖文消息java代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Protobuf的簡要介紹及使用詳解

    Protobuf的簡要介紹及使用詳解

    這篇文章主要介紹了Protobuf的簡要介紹及使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java經(jīng)典排序算法之冒泡排序代碼實例

    Java經(jīng)典排序算法之冒泡排序代碼實例

    這篇文章主要介紹了Java經(jīng)典排序算法之冒泡排序代碼實例,相鄰兩元素進行比較,如過左側元素大于右側元素,則進行交換,每完成一次循環(huán)就將最大元素排在最后,下一次循環(huán)是將其它的數(shù)進行類似操作,需要的朋友可以參考下
    2023-11-11
  • 如何解決SpringBoot2.x版本對Velocity模板不支持的方案

    如何解決SpringBoot2.x版本對Velocity模板不支持的方案

    這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • java讀取某個文件夾下的所有文件實例代碼

    java讀取某個文件夾下的所有文件實例代碼

    這篇文章主要介紹了java讀取某個文件夾下的所有文件實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn)

    Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn)

    本文主要介紹了Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java.sql.SQLException:?connection?holder?is?null錯誤解決辦法

    java.sql.SQLException:?connection?holder?is?null錯誤解決辦法

    這篇文章主要給大家介紹了關于java.sql.SQLException:?connection?holder?is?null錯誤的解決辦法,這個錯誤通常是由于連接對象為空或未正確初始化導致的,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Java中5種異步實現(xiàn)的方式詳解

    Java中5種異步實現(xiàn)的方式詳解

    同步操作如果遇到一個耗時的方法,需要阻塞等待,那么我們有沒有辦法解決呢?讓它異步執(zhí)行,下面我會詳解異步及實現(xiàn),需要的可以參考一下
    2022-09-09
  • Java中String類常用類型實例總結

    Java中String類常用類型實例總結

    在我們開發(fā)中經(jīng)常會用到很多的常用的工具類,這里做一個總結,下面這篇文章主要給大家介紹了關于Java中String類常用類型的相關資料,String類代表字符串,需要的朋友可以參考下
    2021-12-12
  • Springboot?前后端分離項目使用?POI?生成并導出?Excel的操作方法

    Springboot?前后端分離項目使用?POI?生成并導出?Excel的操作方法

    在做一個?SpringBoot?前后端分離項目的時候,需要將數(shù)據(jù)存到?Excel中,用戶可以下載?Excel,具體實現(xiàn)是采用?Apache?強大的?POI,本文給大家介紹Springboot?前后端分離項目使用?POI?生成并導出?Excel相關知識,感興趣的朋友一起看看吧
    2023-09-09

最新評論

荥经县| 隆子县| 卫辉市| 赤峰市| 葵青区| 沂水县| 瑞丽市| 犍为县| 邻水| 邢台市| 永安市| 潢川县| 龙海市| 全椒县| 曲阳县| 横山县| 浪卡子县| 三台县| 日土县| 黄山市| 山丹县| 黎川县| 博兴县| 上饶市| 渭源县| 监利县| 东乡县| 堆龙德庆县| 阳江市| 彭水| 恩施市| 益阳市| 慈溪市| 临高县| 龙海市| 上思县| 安国市| 仪征市| 吉木乃县| 聂荣县| 竹北市|