JPA中@ElementCollection使用

2023-11-08 06:00:38

轉載請註明出處:

  在JPA中,@ElementCollection註解主要用於對映集合屬性,例如List、Set或陣列等集合屬性,以及Map結構的集合屬性,每個屬性值都有對應的key對映。這個註解可以用於實體類的欄位,表示該欄位是一個元素集合,每個元素都會被對映到資料庫中的一行。

  例如,假設我們有一個User實體類,每個使用者可以有多個電話號碼,我們可以使用@ElementCollection註解來對映這個一對多的關係:

@Entity
public class User {
  @Id
  @GeneratedValue
  private Long id;

  private String name;

  @ElementCollection
  private List<String> phoneNumbers;
}

  在這個例子中,phoneNumbers欄位是一個List<String>,每個電話號碼都會被對映到資料庫中的一行。資料庫中會有一個額外的表來儲存這些電話號碼,這個表的每一行都包含一個使用者的ID和一個電話號碼。

  @ElementCollection註解還可以和@CollectionTable註解一起使用,來指定對映集合屬性的表的名稱和結構。例如:

@Entity
public class User {
  @Id
  @GeneratedValue
  private Long id;

  private String name;

  @ElementCollection
  @CollectionTable(name = "user_phones", joinColumns = @JoinColumn(name = "user_id"))
  private List<String> phoneNumbers;
}

  在這個例子中,@CollectionTable註解指定了對映集合屬性的表的名稱為user_phones,並且定義了一個名為user_id的外來鍵列,這個外來鍵列參照了User實體類的ID。

  需要注意的是,@ElementCollection註解只能用於對映基本型別和嵌入式型別,不能用於對映實體類。如果需要對映實體類,應該使用@OneToMany@ManyToMany註解。

  在資料庫中,@ElementCollection註解對應的欄位值會被儲存在一個單獨的表中,每個元素都會被對映到這個表的一行。這個表的每一行都包含一個外來鍵列,這個外來鍵列參照了主實體類的ID,以及一個或多個列來儲存元素的值。

  例如,在上面的User實體類的例子中,phoneNumbers欄位的值會被儲存在user_phones表中,這個表的每一行都包含一個user_id列來參照User實體類的ID,以及一個phone_number列來儲存電話號碼的值。

  在JPA中,@ElementCollection註解對應的欄位值在資料庫中儲存的方式是一條資料對應一行。例如,如果一個使用者有多個電話號碼,那麼這些電話號碼在user_phones表中會被儲存為多條資料,每個電話號碼對應一行。

  user_phones表的表結構通常包含以下欄位:

  • 外來鍵列:這個列用於參照主實體類的ID。在上面的User實體類的例子中,這個列的名稱是user_id
  • 元素值列:這個列用於儲存元素的值。在上面的User實體類的例子中,這個列的名稱是phone_number

  以下是user_phones表的建立語句:

CREATE TABLE user_phones (
 user_id BIGINT,
 phone_number VARCHAR(255),
 PRIMARY KEY (user_id, phone_number),
 FOREIGN KEY (user_id) REFERENCES User(id)
);

  在這個建立語句中,user_id列是一個外來鍵列,它參照了User實體類的ID。phone_number列是一個元素值列,它用於儲存電話號碼的值。user_idphone_number列一起構成了主鍵,這意味著每個使用者的每個電話號碼都會被儲存為一個唯一的行。