关于java:Hibernate映射具有空值的组合键

关于java:Hibernate映射具有空值的组合键

Hibernate mapping a composite key with null values

使用Hibernate,可以创建一个组合ID,其中要映射到该ID的列之一可以为空值吗?

这是要处理具有唯一键的旧表,该键可以具有空值,但不能具有主键。

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


不。主键不能为null。


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

我在视图(!不是表格)中使用了组合ID,在该视图中行可以精确地由2个cols(A,B)标识。尽管cols(B)之一可以具有空值以及正整数。
因此,我的解决方法是我在视图中创建了一个新的col:" BKey ",并且将视图写为好像B为null,那么BKey的值为-1,否则BKey =B。(仅B中为正整数,并且为null )。我还更改了我的复合ID实现,以使用BKey而不是B。
希望对别人有帮助。.


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


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


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


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

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


推荐阅读