2011-12-24 43 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来处理这些项目时,将您的项目放在没有共同父表的多表中可能会导致一些麻烦。