0

我必须设计一个表来存储一些远程数据。我通过网络服务获得的数据有一个候选键,由两列组合而成,但我看到很少有帖子不鼓励在休眠中使用复合键,而是建议使用代理键。如果我使用复合键设计一个表,那么我可以直接更新数据,但如果我使用代理键,那么我必须在更新之前先获取主键。我的问题是我应该使用哪一个,复合键还是代理键?

4

1 回答 1

1

对复合键说不,因为...

  • 它们效率低下(取决于数据库)
  • 使用麻烦
  • 更多数量的参数,而不仅仅是一个
  • 容易出现错误
  • 如果我们有多个列作为复合键,可能会导致数据重复

因此建议使用代理键。虽然它有自己的缺点

  • 性能问题
  • 容易出错
  • 复制

正如Java Persistence with Hibernate参考中所述:

更有经验的 Hibernate 用户只使用 saveOrUpdate();让 Hibernate 决定什么是新的和什么是旧的要容易得多,尤其是在具有混合状态的更复杂的对象网络中。独占 saveOrUpdate() 唯一(不是很严重)的缺点是它有时无法猜测实例是旧的还是新的,除非在数据库中触发 SELECT,例如,当一个类使用自然复合键映射时,并且没有版本或时间戳属性。

可以在此处找到限制的一些表现形式。

因此,在相关时使用自然键,并在最好使用代理键时使用它们。

于 2015-07-10T05:53:22.947 回答