NO IMAGE

在領域模型中,實體與值物件的概念非常重要,Hibernate也要求明確區分這兩者,以至於它們的對映配製上都不一樣。

以一對多為例,同是一個set,如果是實體會使用<one-to-many>,@OneToMany,如果是值物件,會使用<composite-elementt>,@CollectionOfElements.實體與值物件的一個重要區別在於:實體有自己的生命週期,而值物件沒有,它總是依附於一個實體,如果這個實體不存在了,那麼它也將一同消亡。這一點在hibernate的對映上體現的非常明顯:@OneToMany有級聯選項,而@CollectionOfElements沒有。

 

 

小結:

實體與值物件的區別:

1.實體一定要有一個唯一識別符號(ID)!以確保系統能夠明確的區分每一個實體,並在需要的時候準確的找到它。值物件沒有ID!這是因為系統從來不會直接去檢索值物件。值物件總是從屬於某個實體的。

2.實體有自己獨立的生命週期,而值物件沒有。它總是依附於某個實體。如果實體不存在了,它也將一同消亡。

3.不會出現兩個以上的實體引用一個值物件的情況。這也是對2一個保證。如果兩個實體有同樣的值,那也只可能是有兩個值一樣的值物件,而不是引用同一個值物件。

 

典型的值物件例子:金錢,地址。

 

對值物件的資料庫建模的原則:

1.如果這種值物件只是由一種實體使用並且是一對一的關係,那麼使用@Embedded.將值物件的資料列合併到實體表的中。

2.如果有多種實體都會用到這種值物件,或者是一種實體有一組而不是一個值物件,這時候要需要把值物件做成單獨的一張表了。注意:這個單獨的表是一個關聯表,在hibernate中不推薦也不支援把值物件建成一個絕對獨立的表,然後以外來鍵或關聯表的形式去參照一個實體表。請參見JPwH一書6.3 Mapping collections with annotations。