簡體   English   中英

@Entity和@embeddable有什么區別

[英]What is difference between @Entity and @embeddable

@entity和@embeddable注釋在類聲明之前添加每個注釋時的區別?

  1. 第一個創建類作為實體,第二個插入列來自另一個表?
  2. 第一個創建類作為表,而第二個是嵌入另一個類?
  3. 第一個將標准設置為類,第二個定義表類型
  4. 該類的第一個創建表,第二個將一些東西嵌入到不同的類中
  5. 第一個定義表屬性,第二個創建兩個表的並集

對類的@Entity注釋定義了它,它具有獨特的獨立存在。 因此,我們可以運行數據庫查詢,而不依賴於任何其他類。 對類的@Embeddable注釋定義了它,它沒有獨立存在。 因此,我們無法運行數據庫查詢,而不依賴於其他類。 這是一個更好地理解它的例子:

@Entity
User
  -- long id
  -- String name
  -- String email
     @Embedded
  -- UserDetails userDetail

@Embeddable
UserDetails
  -- Date dateOfBirth
  -- String sex
  -- String address
  -- String maritalStatus

在這里你可以看到沒有UserUserDetails是沒用的。

通常,在OOP中,我們首先設計類,然后設計數據庫實體。 對於某些類(如上例中的UserDetails類),我們不希望在DB中有單獨的表,它們的獨立存在是沒有意義的。 在這些情況下,我們將該類標記為可嵌入。

通常,可嵌入類與嵌入它們的實體共享相同的表

實體具有身份並可以查詢。 Embeddables沒有自己的身份,只能查詢使用擁有實體。

如果您打開實體類,您將始終找到@Id注釋 - 它是必需的。 如果你打開一個可嵌入的類,你永遠不會找到@Id注釋 - 它是被禁止的。

編輯:嵌入式只能作為父級的一部分存儲,即在同一個表中,這並不完全正確。 這僅適用於一對一的關系。 您可以在父實體中擁有可嵌入對象的CollectionsMaps ,它們將映射到自己的集合表。

實體類是普通用戶定義的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(域驅動設計)中,我們通常有EntityValue 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM