轉載請註明出處:
在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_id
和phone_number
列一起構成了主鍵,這意味著每個使用者的每個電話號碼都會被儲存為一個唯一的行。