【问题标题】:Generating primary key that is unique across multiple tables生成跨多个表唯一的主键
【发布时间】:2012-01-27 06:23:30
【问题描述】:

我正在使用 Hibernate 开发一个餐厅应用程序。我有几个实体,如比萨、饮料、意大利面等。

我希望将它们保存到不同的表中,但主键在所有表中都是唯一的。 也就是说,如果我说 itemId 4,它应该足以识别任何可用的食物。

你们知道怎么做吗?

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

【问题讨论】:

  • 为什么不将所有项目存储在一个表中,并附加一个表明身份/项目组的字段?
  • @Arjan 从关系的角度来看这是一个很好的解决方案,但它与我的 OO 模型相混淆 :-|其次,这不是适当的规范化。比萨可能具有与啤酒不同的属性。 :-)
  • 真的,我不知道你为每个项目存储了什么属性:)
  • 比萨饼 - 外皮、额外的奶酪、橄榄、蘑菇……等等等等。啤酒 - 布尔是冷冻的 :-)

标签: java mysql database hibernate


【解决方案1】:

我同意 Mark 的观点,看起来像每个子类的表格会适合您的设计,并且需要跨多个项目有一个 id。另请注意,当您需要这些项目的 FK 时,将您的项目放在多个表中而没有公共父表可能会导致一些麻烦。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      UUID 对于所有表都是唯一的,但您将无法仅根据 id 确定哪个表。

      说实话,这有点奇怪。但如果你真的坚持,你可以简单地将表/实体名称添加到主键上。为此,您需要一个自定义生成器。见this question

      您可以使用继承。有一个基本实体@MappedSuperclassItem,将@Inheritance 策略设置为每类表,然后设置PastaPizza。如果字段差异不大,您甚至可以使用带有鉴别器列的单表策略。如果您的实体类型可能会增长,您可以简单地拥有一个 Item 和一列 type

      【讨论】:

      • 使用 UUID 会使 itemId 看起来很难打印在账单和其他东西上。我不能以某种方式获得唯一的整数 ID 吗?
      • 奇怪的要求? :-) 我本可以创建一个 Item 类来表示所有食品。但我想通过适当的分类来保持我的对象模型干净。
      • 哇,这听起来是个好主意。谢谢。虽然在选择答案之前我会等待一段时间,看看是否有任何替代解决方案。 :-)
      【解决方案4】:

      您可以使用 db 序列,然后您的任何实体都可以使用此序列来生成其 Id。

      【讨论】:

        猜你喜欢
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多