27

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

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

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

4

6 回答 6

13

不,主键不能为空。

于 2008-09-16T10:12:18.270 回答
6

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

于 2016-04-15T07:06:22.050 回答
5

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

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

于 2017-02-15T11:17:04.790 回答
0

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

于 2008-09-16T10:12:21.173 回答
0

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

于 2008-09-16T10:16:47.870 回答
-1

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

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

于 2008-09-16T10:10:57.587 回答