@DiscriminatorColumn 註解用於在 JPA 繼承結構中,為單表策略 (InheritanceType.SINGLE_TABLE) 的繼承層次結構指定區分列。這樣,JPA 可以使用這個列來識別每一行對應的具體實體類型。

讓我們詳細解釋一下:

註解部分

1
@DiscriminatorColumn(name="accountType", discriminatorType = DiscriminatorType.STRING)
  • @DiscriminatorColumn:這個註解指定了用來區分不同實體類型的列。
  • name="accountType":這指定了區分列的名稱為 accountType。這個列將會被添加到生成的單表中,用來存儲每一行對應的實體類型。
  • discriminatorType = DiscriminatorType.STRING:這指定了區分列的類型為 STRING。區分列可以是 STRINGCHARINTEGER

作用

當使用 InheritanceType.SINGLE_TABLE 繼承策略時,所有的繼承層次結構中的實體類型都會被映射到同一張表中。區分列 (discriminator column) 用來區分表中的每一行對應哪個具體的實體類型。例如,如果有一個 AdminGroup 基本類和兩個子類 AdminUserAdminManager,這張表中的每一行會有一個 accountType 列來指示該行是 AdminUser 還是 AdminManager

例子

假設我們有以下實體類:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Data
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="accountType", discriminatorType = DiscriminatorType.STRING)
public class AdminGroup implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}

@Entity
@DiscriminatorValue("USER")
public class AdminUser extends AdminGroup {
private String userSpecificField;
}

@Entity
@DiscriminatorValue("MANAGER")
public class AdminManager extends AdminGroup {
private String managerSpecificField;
}

對應的資料庫表可能如下:

id name accountType userSpecificField managerSpecificField
1 AdminUser1 USER someUserValue NULL
2 AdminManager1 MANAGER NULL someManagerValue

在這個表中,accountType 列用來區分每一行是 AdminUser 還是 AdminManager

總結

@DiscriminatorColumn 註解告訴 JPA 在單表策略的繼承結構中,使用 accountType 列來區分不同的實體類型,並且這個列的類型是 STRING。這樣,JPA 就可以正確地將表中的每一行映射到相應的實體類。