使用Hibernate,您是否可以创建一个复合ID,其中您映射到ID的其中一列可以具有空值?
这是为了处理具有唯一键的旧表,该键可以具有空值但没有主键。
我意识到我可以在表格中添加一个新的主键列,但我想知道是否有办法避免这样做。
答案 0 :(得分:10)
没有。主键不能为空。
答案 1 :(得分:0)
你为什么要那样做?您的复合ID应映射表的主键,将空值放入键中听起来不明智,是吗?
编辑: Hibernate不允许这样做;您可以将该属性放在密钥之外并稍微调整DAO,以便在必要时考虑该字段
答案 2 :(得分:0)
这是不可取的。您可以使用视图并映射吗?如果您遇到遗留数据,可以使用COALESCE提供默认值。我们在使用复合键时遇到了很多麻烦,我想零值会导致更多问题。
答案 3 :(得分:0)
对于复合键(假设数据库允许PK中的空值),您可以拥有包含空值的最大number_of_cols ^ 2 - 1个条目(例如,对于2列的复合键,您可以在其主键中具有3行null,第四是没有空的PK。)
答案 4 :(得分:0)
您不会收到错误,但Hibernate无法将复合列的NULL值映射到您的实体。这意味着您在结果中获得了具有NULL值的实体。
答案 5 :(得分:0)
不幸的是,没有。我要么必须使用解决方法:
我使用composit Id作为视图(!not table),其中行可以被2个cols精确地标识(A,B)。虽然其中一个col(B)可以具有空值以及正整数。 所以我的解决方法是在视图中创建了一个新的col:" BKey"并且我的视图被写成好像B是null然后BKey的值是-1否则BKey = B.(只有正整数在B中出现并且为null)。我还改变了我的composit id实现,使用BKey而不是B. 希望对某人有帮助..