生成在多个表中唯一的主键

时间:2011-12-24 09:24:25

标签: java mysql database hibernate

我正在使用Hibernate开发餐馆应用程序。我有几个实体,如比萨饼,饮料,面食等。

我希望将这些表持久保存到不同的表中,但主键是唯一的。 即如果我说itemId 4就足以识别任何可用的食物。

知道如何做这些人吗?

我更喜欢使用Hibernate注释的解决方案。 : - |

4 个答案:

答案 0 :(得分:3)

您可以使用数据库序列,然后您的任何实体都可以使用此序列生成其ID。

答案 1 :(得分:2)

UUID对于所有表都是唯一的,但您无法确定该表仅基于id。

老实说,这有点奇怪的要求。但是如果你真的坚持它,你可以简单地将表/实体名称加到主键的前面。为此,您需要一个自定义生成器。请参阅this question

您可以使用继承。有一个基本实体@MappedSuperclass Item,其中@Inheritance策略设置为每个类的表,然后是PastaPizza。如果字段没有太大差异,则使用带有鉴别器列的单表策略。如果您的实体类型可能会增长,您只需拥有一个Itemtype

答案 2 :(得分:2)

我认为你没有完全正确的分析。如果你看看你将如何使用你提到的实体,我认为还会有一个像订单这样的实体将包含其中的几个,所有这些实体都有一些相似性,它们都可以被视为“菜单项”的子类,因为它们都有一些共同的属性,例如价格可以以相同的方式使用,例如包含在订单中。

您可以查看Hibernate core documentation中的第5.1.6节,了解如何实现将OO模型映射到表或多个表的各种策略。请注意每类策略表和10.1.5。每个具体类的表将为您提供当前的表设置,但您需要能够生成您无法轻松完成的密钥。但是我认为你会发现应该在基类上有共同的属性,因此需要另一种形式的映射,最终得到一个菜单项表,并且可以很容易地生成一个id。

答案 3 :(得分:0)

我同意Mark,看起来像每个子类的表格适合您的设计,并且需要在多个项目中具有id。另请注意,如果您需要为这些项目提供FK,那么在没有公共父表的情况下将项目放在多个表中可能会导致一些问题。