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 上獲取。