[英]What is difference between @Entity and @embeddable
@entity和@embeddable注釋在類聲明之前添加每個注釋時的區別?
對類的@Entity
注釋定義了它,它具有獨特的獨立存在。 因此,我們可以運行數據庫查詢,而不依賴於任何其他類。 對類的@Embeddable
注釋定義了它,它沒有獨立存在。 因此,我們無法運行數據庫查詢,而不依賴於其他類。 這是一個更好地理解它的例子:
@Entity
User
-- long id
-- String name
-- String email
@Embedded
-- UserDetails userDetail
@Embeddable
UserDetails
-- Date dateOfBirth
-- String sex
-- String address
-- String maritalStatus
在這里你可以看到沒有User
, UserDetails
是沒用的。
通常,在OOP中,我們首先設計類,然后設計數據庫實體。 對於某些類(如上例中的UserDetails類),我們不希望在DB中有單獨的表,它們的獨立存在是沒有意義的。 在這些情況下,我們將該類標記為可嵌入。
通常,可嵌入類與嵌入它們的實體共享相同的表
實體具有身份並可以查詢。 Embeddables沒有自己的身份,只能查詢使用擁有實體。
如果您打開實體類,您將始終找到@Id
注釋 - 它是必需的。 如果你打開一個可嵌入的類,你永遠不會找到@Id
注釋 - 它是被禁止的。
編輯:嵌入式只能作為父級的一部分存儲,即在同一個表中,這並不完全正確。 這僅適用於一對一的關系。 您可以在父實體中擁有可嵌入對象的Collections
和Maps
,它們將映射到自己的集合表。
實體類是普通用戶定義的Java類,其實例可以存儲在數據庫中。
@Entity
@Table(name="dog")
public class Dog{
@Id
@Column(name = "id")
private int id;
@Embedded
private Animal animal;
public Dog(int id,Animal animal){
this.id=id;
this.animal=animal;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Animal getAnimal() {
return animal;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
}
可嵌入類是用戶定義的可持久類,用作值類型。 與其他非實體類型一樣,可嵌入類的實例只能作為嵌入對象存儲在數據庫中,即作為包含實體對象的一部分。
@Embeddable
public class Animal {
@Column(name = "name")
private String name;
@Column(name = "location")
private String location;
public Animal(){
}
public Animal(String name,String location){
this.name=name;
this.location=location;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
這是一個古老的話題,但我想補充一點,從理論的角度來看更多。 在DDD(域驅動設計)中,我們通常有Entity
和Value Objects
。 第一個只能通過他們擁有的identity
來識別。 第二個不是由標識定義的,這意味着如果構成該特定對象的所有組件都相同,則2個值對象是相同的 。
類比是在這種情況下,如果我們要應用DDD,則Entity
是使用@Entity
注釋的類,而Value Object
是具有@Embeddable
。 這種情況的一個例子是,可嵌入對象作為附加信息添加到現有記錄中,現有記錄已經在嵌入對象外部定義its own identity
。
那么@Entity表示實體對象本身具有重要性,它不需要與任何其他對象進一步關聯。 由於@Embeddable對象本身並不具有任何重要性,因此它需要與其他對象相關聯。
讓我們舉一個例子,說我有一個Employee對象,它有一個Address Object集合作為其成員變量。 現在,當談到任何地址時,我們需要告訴它是誰的地址,員工解決的是。 如果我們只是談論地址它沒有任何意義。 希望這能給你兩者之間的差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.