JPA中@JoinColumn和@PrimaryKeyJoinColumn的區別
1. 概述
在本教程中,我們將了解 Java Persistence API (JPA) 中@JoinColumn和@PrimaryKeyJoinColumn之間的區別。
JPA 允許應用程序訪問關係數據庫中的數據。它讓我們定義數據如何存儲在數據庫中以及應用程序如何訪問數據。
Java 對象通過 JPA 註釋映射到數據庫表。有多個 JPA 註釋,但我們將重點關注@JoinColumn和@PrimaryKeyJoinColumn 。
2. @JoinColumn註解
@JoinColumn註釋定義將連接兩個實體的列。它定義實體的外鍵列及其關聯的主鍵字段。
此註釋允許我們在實體之間創建關係,快速保存和訪問數據。通常,它與@ManyToOne或@OneToOne註釋一起使用來定義關聯。
下面的示例展示瞭如何使用@JoinColumn註釋:
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id", referencedColumnName = "id")
private Department department;
// getters and setters
}
@Entity
@Table(name = "departments")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// getters and setters
}
在上面的示例中, Employee實體和Department實體具有多對一關係。 @JoinColumn指示兩個實體之間的連接列。
name參數指定employees中的外鍵列,而referencedColumnName指定departments中的主鍵列。
3. @PrimaryKeyJoinColumn註解
@PrimaryKeyJoinColumn註釋指定一個實體的主鍵是另一個實體的外鍵。它通過在實體表中將兩個實體的主鍵列設為外鍵來映射兩個實體之間的關係。
下面的示例展示瞭如何使用@PrimaryKeyJoinColumn註釋:
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@PrimaryKeyJoinColumn
private Department department;
// getters and setters
}
@Entity
@Table(name = "department")
public class Department {
@Id
private Long id;
private String name;
// getters and setters
}
示例中有兩個實體: Person和Department 。 Person實體有一個名為Department的字段,該字段使用@OneToOne和@PrimaryKeyJoinColumn引用Department實體。
Department表的主鍵將是Person表的外鍵。 Department實體有一個@Id字段,充當Department表的主鍵。
4. @JoinColumn和@PrimaryKeyJoinColumn的區別
JPA 註解@JoinColumn和@PrimaryKeyJoinColumn之間的主要區別在於它們對實體之間關係的處理。
@JoinColumn指的是一個表中包含另一個表的外鍵的列。當一個表中的外鍵引用另一表的主鍵時,使用此註釋。
相反, @PrimaryKeyJoinColumn指示關聯應該由與關聯實體的主鍵相對應的外鍵列進行映射。
簡而言之, @JoinColumn映射常規外鍵關聯。但是, @PrimaryKeyJoinColumn映射一個關聯,其中關聯實體的主鍵也用作當前實體中的外鍵。
需要注意的是, @PrimaryKeyJoinColumn通常用於一對一映射,但@JoinColumn可以用於一對一、一對多、多對一和多對多映射。
5. 何時使用@JoinColumn與@PrimaryKeyJoinColumn
我們建立關係的方式取決於當前的情況。為了澄清外鍵列的映射,我們可以使用@JoinColumn ,特別是當它不是目標實體的主鍵時。
當外鍵列是目標實體的主鍵時,我們可以使用@PrimaryKeyJoinColumn 。如果未指定註釋,JPA 將採用依賴於實體和屬性名稱的映射策略。
六,結論
在本文中,我們研究了@JoinColumn和@PrimaryKeyJoinColumn,強調了它們的區別。它們以一對一或多對一的關係將一個實體連接到另一個實體。
與往常一樣,所有源代碼都可以在 GitHub 上獲取。