2016-02-03 395 views
5

在Java中可以註釋類爲@Embeddable或將屬性設置爲@Embedded。示例代碼:何時使用@Embedded和@Embeddable?

@Embeddable 
class A{ 
... 
} 

class B{ 
... 
} 

@Entity 
class Foo { 
    A a; 
    @Embedded B b; 
} 

當喜歡@Embedded@Embeddable

+1

您是否諮詢了這些註釋的Javadoc? – wero

回答

0

這兩者都處於休眠使用註釋:

用於組合主鍵@Embeddable使用。

@Embedded實體與父實體合併在一起,就好像它們在那裏一直被聲明一樣。有時候,你有一個包含多列的巨大表(特別是對於遺留數據庫)。然而,有些列在邏輯上彼此相關(如CUSTOMER表中的街道,城市和電話號碼)。如果您不想使用所有字段創建對象,則可以創建嵌入式地址對象。通過這種方式,您可以將地址列邏輯分組爲一個對象,而不是將同樣龐大的POJO與一組平坦的字段列表組合在一起。

0

如果我們有人和地址兩個POJO,您不想爲地址創建另一個表,但是您希望將該地址嵌入到人員表中。所以地址是爲Person對象添加值,但沒有任何意義。在這種情況下,我們可以一起去:

@Embeddable 
public class Address{ 
} 

@Entity 
public class Person 
{ 

@Embedded 
private Address address; 

} 
3

有用於@Embedded/@Embeddable兩個主要用途,據我所知:

首先,也是最重要的:拆分大型實體類。在數據庫世界中,一個很大的表(很多列)是很好的。打破這樣的表格甚至會使事情變得更糟,並且與數據庫設計原則相沖突。另一方面,在Java(或一般的面向對象的語言)中,大類是code smell。在這裏,我們想將包括實體類在內的類拆分成更小的單元。 @Embedded/@Embeddable允許我們輕鬆地做到這一點,而不必拆分數據庫表。其次,它允許重用實體之間的通用映射。假設每個表都有一個簡單的修訂追蹤,其中兩列包含更改行的人的用戶名以及發生的時間。然後,我們可以創建一個覆蓋這些行的實體,然後通過嵌入它來重複使用它(而不是重複每個實體中與這些列對應的變量)。