2014-01-15 288 views
6

在類聲明之前添加每一個@entity和@embeddable註解之間的區別?@Entity和@embeddable之間有什麼區別

  1. 第一個創建類作爲實體,第二個插入列從另一個表?
  2. 第一個創建類作爲表,第二個嵌入另一個類?
  3. 第一組標準爲一類,第二限定表型
  4. 第一創建表該類,第二嵌入的東西分成不同的類
  5. 兩個表的第一限定表屬性,第二創建聯合

回答

16

@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中擁有單獨的表,其獨立存在是無意義的。在這些情況下,我們將該類標記爲可嵌入的。

通常,嵌入類共享同一個表作爲在它們被嵌入

+0

可嵌入組件可以擁有自己的數據庫表,以防您將它們用作包,集合,列表和映射(1個實體具有多個可嵌入組件實例時的一對多關係)集合的一部分。 – Aladin

7

實體擁有身份和可被查詢的實體。 Embeddables沒有自己的身份,只能使用擁有實體進行查詢。

如果您打開一個實體類,您將始終找到@Id註釋 - 這是強制性的。如果您打開一個嵌入式課程,您將永遠找不到@Id註釋 - 這是禁止的。

編輯:這是不完全正確的,可嵌入只能存儲爲父,即在同一個表中的一部分。這僅適用於一對一的關係。您可以在父實體中嵌入對象的CollectionsMaps,它們將映射到自己的收集表。

2

實體類是一個普通的用戶定義的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; 
    } 
} 
1

這是一個老話題,但我想補充我的答案,這更多的是從理論的角度。在DDD(域驅動設計)中,我們通常有EntityValue Objects。第一個只能通過他們擁有的identity來識別。第二個不是由身份定義的,這意味着如果所有組成該特定對象的組件都是相同的,那麼2個值對象是相同的

的比喻是,在這種情況下,如果我們採用DDD的Entity@Entity註釋的類和Value Object是一個與@Embeddable。這是一個事實,即可嵌入對象作爲附加信息添加到現有記錄中,該記錄已經在嵌入對象的外部定義了its own identity

相關問題