Hibernate复合键或代理键

时间:2015-07-10 05:41:05

标签: hibernate composite-key surrogate-key

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

1 个答案:

答案 0 :(得分:1)

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

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

因此建议使用代理密钥。虽然它有其自身的缺点

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

Java Persistence with Hibernate 参考:

中所述
  

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

可以找到限制的一些表现形式here

因此,在相关时使用自然键,并在使用时更好地使用代理键。