【问题标题】:Should I use composite primary keys if I use JPA and the keys can change?如果我使用 JPA 并且键可以更改,我应该使用复合主键吗?
【发布时间】:2013-06-10 21:04:28
【问题描述】:
我有点困惑是否应该使用复合主键或代理键。
最初我想在需要时使用复合主键,以便拥有一个更清晰的数据库,但是键的某些部分可能会更改,并且 JPA 不允许更新对象的主键。
例如,我有一个 Product 实体,它的主键由字符串代码和另一个实体 Account 组成。代码可以更新,但使用 JPA,我只能使用我想避免的 JPQL 来做到这一点。在这种情况下使用自动递增的主键好吗?
这是否意味着唯一的解决方案是使用代理键?
谢谢
【问题讨论】:
标签:
database
jpa
primary-key
composite-primary-key
【解决方案1】:
如你所说,根据规范 JPA 不支持更新主键:
应用程序不得更改主键的值[10]。这
如果发生这种情况,行为是不确定的。[11]
...
[10] 这包括不
更改作为主键或主键的可变类型的值
复合主键的属性。
[11] 实施可能,但是
不需要,抛出异常。便携式应用程序不得
依赖于任何此类特定行为。
在我看来,使用代理键是最好的选择,大多数时候也会自动递增一个。
其他选项是使用原始密钥删除实体并使用新密钥(以及原始实体的其他值)重新创建它。这是大量的工作,尤其是对于具有许多关系的实体。