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

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

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

有帮助吗?

解决方案

不。主键不能为空。

其他提示

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

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

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

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

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

不幸的是,没有。我要么必须使用解决方法:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top