1

如果我应该使用复合主键或代理键,我有点困惑。

最初,我想在需要时使用复合主键,以便拥有更清晰的数据库,但是键的某些部分可能会更改,并且 JPA 不允许更新对象的主键。

例如,我有一个 Product 实体,它的主键由字符串代码和另一个实体 Account 组成。代码可以更新,但使用 JPA,我只能使用我想避免的 JPQL 来做到这一点。在这种情况下使用自动递增的主键好吗?

这是否意味着唯一的解决方案是使用代理键?

谢谢

4

1 回答 1

1

如您所说,根据规范 JPA 不支持更新主键:

应用程序不得更改主键的值[10]。如果发生这种情况,则行为未定义。 [11]
...
[10] 这包括不更改作为主键的可变类型的值或复合主键的属性。
[11] 实现可以但不是必须抛出异常。便携式应用程序不得依赖任何此类特定行为。

在我看来,使用代理键是最好的选择,大多数时候也会自动递增一个。

其他选项是使用原始键删除实体并使用新键(以及原始实体中的其他值)重新创建它。这是大量的工作,尤其是对于具有许多关系的实体。

于 2013-06-11T07:32:57.620 回答