2009-11-08 68 views
4

我試圖設計一個非常簡單的應用程序,並且讓自己對Hibernate對實體和值對象的定義(如Java Persistence with Hibernate的第4章中定義)有點困惑。Hibernate映射中的值對象或實體對象?

我有一個應用程序與客戶,誰可以下訂單(一對多關係)。每個訂單都有許多訂單行(也是一對多)。現在,我認爲客戶有身份(客戶號碼),訂單(訂單號碼)也是這樣,因此它們是實體對象?我的疑惑來自訂單行。

訂單項有數量,產品編號和價格。訂單行在沒有訂單的情況下不能存在,並且沒有自己的身份,因此我將其視爲價值對象。但是我不能讓訂單行成爲訂單表的一部分,因爲訂單和訂單行之間存在一對多的關係。一對多關係如何與值對象的定義一起工作?從Hibernate書籍:

「值類型的對象沒有數據庫標識;它屬於一個實體實例,其持久狀態嵌入到擁有實體的錶行中。值類型沒有標識符或標識屬性」

如果任何人都可以清理我的困惑我真的很感激它:)

回答

6

Hibernate的文檔,使得區分實體類型值類型,而不是值對象。

  • 對象實體類型:擁有自己的數據庫身份值類型的
  • 對象:屬於一個實體,它的持久狀態被嵌入擁有實體的表中一行。值類型沒有標識符或標識符屬性。

據我可以記得,書中使用具有表示爲單個串的addressuser對象,其中包含一個地址字符串的樣品:

  • 實現爲值類型(通常意味着在數據庫級別的同一個表中的列),如果用戶被刪除,那麼它的地址也是如此。沒有用戶,地址就無法生存,無法共享。

  • 作爲一個實體類型(這可能意味着使用一個單獨的表)實施,地址將存在於他們自己的權利,沒有用戶和兩個用戶將能夠共享相同的地址。

在你的情況下,一個訂單不屬於訂單,它的持久狀態不是嵌入命令行中(沒有意義),它有它自己的身份(做的orderId和productId)。訂單行絕對不是一個值類型,它是一個實體類型。實際上,一旦你根據關聯性(一對一,一對多等)來思考,你肯定會操縱實體。

1

我想你所擁有的是一個比較通用的ORM問題。

您提到「訂單行不能在沒有訂單的情況下存在,並且沒有自己的標識」。
嗯,雖然OrderLine不能與Order一起存在,但並不意味着它不能擁有身份。

把你的訂單實體,它不能存在沒有客戶,但你已經認爲它是一個實體,是嗎?

所以,在這裏是爲實體的建議:
- 客戶(可以沒有以上的訂單實體)
- 訂單(可有一個或多個訂單行實體)
- 訂單行

1

我想你正在尋找一個複合元素。在參考文獻中有一個實際使用Order和purchasedItems(訂單行)的例子。當Hibernate說,它不能單獨存在,但這並不意味着它不能擁有自己的表,只是它總是與父元素相關聯:

<class name="eg.Order" .... > 
    .... 
    <set name="purchasedItems" table="purchase_items" lazy="true"> 
    <key column="order_id"/> 
    <composite-element class="eg.Purchase"> 
     <property name="purchaseDate"/> 
     <property name="price"/> 
     <property name="quantity"/> 
     <many-to-one name="item" class="eg.Item"/> 
    </composite-element> 
    </set> 
</class> 

來源:Collections of dependent objects

0

值對象是一個小對象,表示一個簡單的實體,其等式不基於身份:即兩個值對象在具有相同值時相同,不一定是相同的目標

0

您可以將訂單行作爲值類型值類型支持一對一映射以及一對多映射。 很明顯,Java集合用於映射值類型與實體的*到多關係。在適當的集合中,元素和複合元素按要求使用,如下所述: 對於實體和值之間的一對多關係類型(非JDK類型),使用複合元素。 對於值類型表包含JDK類型(比如字符串)的單個屬性的一對多關係,使用元素。 這個概念在Hibernate的Java持久化的第6章中給出。 有關詳情,請參閱此鏈接 https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/components.html