2011-12-24 80 views
2

我正在使用Hibernate的餐廳應用程序。我有幾個實體,比如披薩,飲料,麪食等。生成在多個表中唯一的主鍵

我希望這些被持續到不同的表,但有主鍵是唯一的。 即即使我說itemId 4它應該足以識別任何可用的食品。

任何想法如何做到這一點?

我寧願使用Hibernate註釋的解決方案。 : - |

+0

爲什麼不將所有項目存儲在一個表格中,並附加了一個表示身份/項目組的字段? – Arjan

+1

@Arjan從關係角度來看是一個很好的解決方案,但它與我的OO模型混淆: - |其次,這是不正常的正常化。比薩可能與啤酒有不同的屬性。 :-) –

+0

確實,我不知道你爲每個項目存儲了什麼屬性:) – Arjan

回答

2

UUID對於所有表格都是唯一的,但是您將無法確定哪個表格僅基於id。

說實話,這有點奇怪的要求。但是如果你確實堅持這一點,你可以簡單地在表/實體名稱前加上主鍵。爲此,你需要一個自定義生成器。見this question

您可以使用繼承。有一個基本實體@MappedSuperclassItem,其中@Inheritance戰略設置爲每班級表,然後Pasta,Pizza。如果這些字段的差異不大,甚至可以使用帶有鑑別器列的單表策略。如果你的實體類型可能增長,你可以簡單地有一個Item與列type

+0

使用UUID會使itemIds在賬單和東西上打印真的很難看。難道我不能以某種方式獲得獨特的整數ID嗎? –

+0

奇怪的要求? :-)我可以創建一個Item類來表示所有的食物。但我想通過適當的分類來保持對象模型的清潔。 –

+0

看到我的更新.. – Bozho

3

你可以使用一個數據庫序列,然後你的任何實體可以使用這個序列來生成他們的ID。

+0

mysql不支持序列,這就是我正在使用的... –

2

我認爲你沒有得到相當正確的分析。如果你看看你將如何使用你提到的實體,我認爲也會有一個像這樣的實體,它包含了其中的幾個實體,而且所有這些實體都有一些相似性,它們都可以被認爲是「菜單項」的一個子類,因爲它們都有一些共同的屬性,例如價格,並且可以以相同的方式使用,例如包括在一個命令中。

有關如何實現將OO模型映射到一個或多個表格的各種策略,可以參見Hibernate core documentation中的第5.1.6節。注意Table per class strategy和10.1.5。每個具體類的表會給你你當前的表設置,但你需要能夠生成你坐在MySQL中的密鑰不能輕易做到。不過,我認爲你會發現應該在基類上有一些共同的屬性,所以需要另一種映射形式,並且最終得到一個菜單項表,並且可以很容易地生成一個生成的id。

+0

謝謝,這真的幫助.. –

0

我同意馬克,看起來像每個子類表一樣適合您的設計,並需要跨多個項目有一個ID。另外請注意,當您需要使用FK來處理這些項目時,將您的項目放在沒有共同父表的多表中可能會導致一些麻煩。