如果我使用JPA并且密钥可以更改,我应该使用复合主键吗?

时间:2013-06-10 21:04:28

标签: database jpa primary-key composite-primary-key

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

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

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

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

由于

1 个答案:

答案 0 :(得分:1)

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

  

应用程序不得更改主键的值[10]。该   如果发生这种情况,行为是不确定的。[11]
  ...
  [10]这包括没有   更改作为主键或可变类型的可变类型的值   复合主键的属性   [11]实施可能,但是   不需要,抛出异常。便携式应用程序不得   依赖任何这样的特定行为。

在我看来,使用代理键是最佳选择,大部分时间也会自动增加一个。

其他选项是删除具有原始密钥的实体并使用新密钥(以及来自原始实体的其他值)重新创建它。这是很多工作,特别是对于有很多关系的实体。