iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

本來要在 Day 17 One-to-One 放這首新歌當 BGM 但一個忙碌就把它給忘了
今天歌曲是紫棋改編改詞的翻唱歌曲 ⟪唯一⟫,推薦給大家/images/emoticon/emoticon24.gif
Yes

在現實世界中經常會發現其中一個事物與其他多品項有所關聯。這樣的現象在資料庫設計中稱為 One-to-Many 關聯。今天會討論這種關聯的特點、實作方式,以及如何在 Spring Data JPA 中正確地使用它。

一、One-to-Many 關聯基礎

One-to-Many 關聯,意思是一實體 A 可以與多個實體 B 有所關聯,但是一個實體 B 只能與一個實體 A 關聯。

舉例

  1. 一個作者可以寫多本書,但每本書只能有一個作者 → 作者和書間的關係即是 One-to-Many。
  2. 部落格中的一篇文章(Post)可能有多則留言(Comment) → 文章和留言間的關係即是 One-to-Many。

二、在 Spring Data JPA 中實現 One-to-Many

要在 Spring Data JPA 中實現 One-to-Many 關聯,主要會使用 @OneToMany@ManyToOne 這兩個註解。

範例

假設有 AuthorBook 兩個實體,它們之間的關聯如下:

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Book> books;
}
  • @OneToMany: 定義這是一個一對多的關係。這個屬性的值是一個集合類型(例如 List、Set 等)。
  • mappedBy = "post": 指定由 Book 中的 author 屬性來進行映射。
  • cascade = CascadeType.ALL: 所有關於 books 的資料庫操作都會影響主實體,這裡主實體是 Author。
  • orphanRemoval = true: 當 Book 被從 books 集合中移除時,這個 Book 會被刪除。
  • 這裡的 @OneToMany 註解表示 Author 與多本 Book 有所關聯。

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;
}

  • @ManyToOne 則表示 Book 只能與一位 Author 有所關聯。

三、One-to-Many 關聯中常見的問題及解決策略

  1. N+1 查詢:當我們從 Author 實體中取得其相關的多本 Book 時,可能會遇到這個問題。

    solution:使用 JPA 的 JOIN FETCH 或考慮使用 Hibernate 的 BatchSize 註解。

  2. 資料同步:在雙向關聯中,當一方的資料變動時,另一方可能不會同步更新。

    solution:當更新一邊的資料時,記得也要手動更新另一邊的資料,以確保資料的一致性。

  3. 資料庫性能:使用 EAGER 加載策略可能導致資料庫效能下降。

    solution:在不需要 EAGER 加載的情況下,優先使用 LAZY 加載。


上一篇
Day 17 - From One-to-One to Many-to-One
下一篇
Day 19 - Many-to-Many
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言