關聯是一個強大的概念,它有助於開發者建立高效、可測試且易於維護的應用程序。通過適當地管理組件之間的關聯,開發者可以更容易地構建和維護具有高度可擴展性的應用程序。
用於建立實體類之間的一對一資料庫關聯。它允許您在兩個實體類之間建立一種特殊類型的關聯,其中一個實體對象與另一個實體對象相關聯。
表示關聯實體之間在特定操作(例如保存、更新、刪除等)時的自動行為的一個設定屬性。
CascadeType.ALL:當父實體進行任何操作時,自動對關聯的所有子實體執行相同的操作(包括保存、更新、刪除等)。
CascadeType.PERSIST:當父實體進行保存(persist)操作時,自動對關聯的子實體執行保存操作。
CascadeType.MERGE:當父實體進行更新(merge)操作時,自動對關聯的子實體執行更新操作。
CascadeType.REMOVE:當父實體進行刪除(remove)操作時,自動對關聯的子實體執行刪除操作。
CascadeType.REFRESH:當父實體進行刷新(refresh)操作時,自動對關聯的子實體執行刷新操作。
是用於指定實體之間關聯查詢時加載策略的屬性。它用於控制關聯實體在查詢時是否被立即加載,以及如何加載。
EAGER(立即加載): 使用 EAGER 策略時,JPA 在查詢實體時會立即加載關聯實體的數據。這意味著當你獲取一個實體時,與之關聯的其他實體也會被一同加載。這樣可以確保在獲取主實體後,關聯的實體數據都已經準備好,可以立即訪問。
LAZY(延遲加載): 使用 LAZY 策略時,JPA 在查詢實體時不會立即加載關聯實體的數據。相反,只有當你第一次訪問關聯實體時,它的數據才會被加載。這樣可以避免在查詢主實體時立即加載大量關聯實體數據,節省資源和提高性能。
關聯所指向的物件沒有其他的關聯對象,就被稱為「孤立物件」。"orphanRemoval" 是一種在關聯性映射中的功能,它允許自動刪除這些孤立的物件,以確保資料庫中的資料與應用程式的物件模型保持一致。
簡單舉例,orphanRemoval為true的情況下,假設你有一個部門裡面有一些員工,當部門被移除所有員工資料也會被移除
告訴JPA自己不是關係維護端,同時也讓JPA知道維護方是誰,也決定擁有方與被擁有方(通常是擁有方,也就是Many那方)。以mappedBy = "door"為例,他指向了Key類中的door作為維護方,因此Key類中將會有外鍵用於表示與Door類的關聯。
當Door類想去查看有哪些key是與其對應的就必須向private Door door;去取得對應Key類的資料
假設我有兩個實體類分別為Door與Key,一個門對應一把鑰匙,這時候就應該設定關聯使得鑰匙可以對應到匹配的門
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Door {
@Id
@GeneratedValue
private Long id;
private String doorName;
private String type;
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Key {
@Id
@GeneratedValue
private Long id;
private String keyName;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "door_id")// 指定在Key表中的外鍵欄位名稱
private Door door;
}
我們在屬性key上方添加了@OneToOne註解
接著去抓出我們key的資料
@PostMapping("/ex")
public Key ex(){
var door = Door.builder()
.type("open")
.doorName("digDoor")
.build();
doorRepository.save(door);
var key = Key.builder()
.keyName("digKey")
.door(door) //這裡將此鑰匙著名與剛剛創建的門有關聯
.build();
keyRepository.save(key);
return key;
}
可以發現抓出key後也可以知道他與哪個門有關