如果我应该使用复合主键或代理键,我会感到有点困惑。
最初我想在需要时使用复合主键,因此有一个更清晰的数据库,但键的某些部分可能会更改,JPA不允许更新对象的主键。
例如,我有一个Product实体,其主键由String代码和另一个实体Account组成。代码可以更新,但使用JPA我只能用JPQL来做,我想避免。在这种情况下使用自动递增的主键是否好?
这是否意味着唯一的解决方案是使用代理键?
由于
答案 0 :(得分:1)
正如您所说,根据规范,JPA不支持更新主键:
应用程序不得更改主键的值[10]。该 如果发生这种情况,行为是不确定的。[11]
...
[10]这包括没有 更改作为主键或可变类型的可变类型的值 复合主键的属性 [11]实施可能,但是 不需要,抛出异常。便携式应用程序不得 依赖任何这样的特定行为。
在我看来,使用代理键是最佳选择,大部分时间也会自动增加一个。
其他选项是删除具有原始密钥的实体并使用新密钥(以及来自原始实体的其他值)重新创建它。这是很多工作,特别是对于有很多关系的实体。