【发布时间】:2024-05-02 17:50:02
【问题描述】:
我必须设计一个表来存储一些远程数据。我通过网络服务获得的数据有一个候选键,由两列组合而成,但我看到很少有帖子不鼓励在休眠中使用复合键,而是建议使用代理键。如果我使用复合键设计一个表,那么我可以直接更新数据,但如果我使用代理键,那么我必须在更新之前先获取主键。我的问题是我应该使用哪一个,复合键还是代理键?
【问题讨论】:
标签: hibernate composite-key surrogate-key
我必须设计一个表来存储一些远程数据。我通过网络服务获得的数据有一个候选键,由两列组合而成,但我看到很少有帖子不鼓励在休眠中使用复合键,而是建议使用代理键。如果我使用复合键设计一个表,那么我可以直接更新数据,但如果我使用代理键,那么我必须在更新之前先获取主键。我的问题是我应该使用哪一个,复合键还是代理键?
【问题讨论】:
标签: hibernate composite-key surrogate-key
对复合键说不,因为...
因此建议使用代理键。虽然它有自己的缺点
如 Java Persistence with Hibernate 参考中所述:
更有经验的 Hibernate 用户只使用 saveOrUpdate();它的 让 Hibernate 更容易决定什么是新的和什么是旧的, 特别是在具有混合状态的更复杂的对象网络中。这 独占 saveOrUpdate() 的唯一(不是很严重)缺点是 它有时无法猜测一个实例是旧的还是新的 无需在数据库中触发 SELECT ——例如,当一个类 使用自然复合键映射,没有版本或时间戳 属性。
限制的一些表现可以找到here。
因此,在相关的情况下使用自然键,并在最好使用代理键时使用它们。
【讨论】: