【问题标题】:Hibernate mapping a composite key with null valuesHibernate 使用空值映射复合键
【发布时间】:2010-09-09 09:54:04
【问题描述】:

使用 Hibernate,您能否创建一个复合 ID,其中您映射到该 ID 的列之一可以具有空值?

这是为了处理具有唯一键的遗留表,该键可以有空值但没有主键。

我意识到我可以在表中添加一个新的主键列,但我想知道是否有任何方法可以避免这样做。

【问题讨论】:

  • 我想知道这是否也是可能的,我的数据库(OpenEdge)不支持视图,我无法向表中添加新字段,您是如何克服这个问题的?
  • 他们将来可能会更新 javadoc hibernate.atlassian.net/browse/HHH-14535

标签: java hibernate


【解决方案1】:

您为什么要这样做?您的复合 ID 应该映射表的主键,将空值放在键中听起来并不明智,是吗?

编辑: Hibernate 不允许这样做;您可以将属性放在键之外并稍微调整 DAO 以在必要时考虑该字段

【讨论】:

  • 映射到旧表是可能需要这样做的原因之一。我有一个情况,这也是必需的,并且数据库不支持视图(Progress OpenEdge)。
  • 我也有同样的问题。我有一个带有 4 个属性的 @Embedded(这是一个视图,我无法控制它)。其中一些可以为null,但它们的组成不能相同(ford,red,4,4),例如(ford,red,4,null)。我该怎么办?
【解决方案2】:

没有。主键不能为空。

【讨论】:

  • 我们的客户提供了一个没有任何主键的视图。对于 Hibernate,我必须定义一个 PK。但唯一唯一的字段组合包括一个可为空的字段。
【解决方案3】:

这是不可取的。您可以使用视图和地图来代替吗?如果您遇到遗留数据,您可以使用 COALESCE 提供默认值。我们在使用复合键时遇到了很多麻烦,我想 null 值会导致更多问题。

【讨论】:

    【解决方案4】:

    对于复合键(假设数据库允许 PK 中的空值),您最多可以有 number_of_cols^2 - 1 个包含空值的条目(例如,对于 2 列的复合键,您可以有 3 行的主键为空,第四个是没有空值的PK)。

    【讨论】:

      【解决方案5】:

      您不会得到错误,但 Hibernate 将无法将复合列的具有 NULL 值的行映射到您的实体。这意味着您会在结果中获得具有 NULL 值的实体。

      【讨论】:

        【解决方案6】:

        很遗憾,没有。我要么不得不使用解决方法:

        我将复合 ID 用于视图(!不是表),其中行可以由 2 个列(A,B)精确标识。尽管其中一个列 (B) 可以具有空值以及正整数。 所以我的解决方法是我在视图中创建了一个新的 col:“BKey”并且我的视图被写成 B 为空,那么 BKey 的值为 -1,否则 BKey = B。(只有正整数出现在 B 和空)。我还更改了我的合成 id 实现以使用 BKey 而不是 B。 希望它对某人有所帮助..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 2014-01-19
          相关资源
          最近更新 更多