【问题标题】:Hibernate composite-key or surrogate-keyHibernate 复合键或代理键
【发布时间】:2024-05-02 17:50:02
【问题描述】:

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

【问题讨论】:

    标签: hibernate composite-key surrogate-key


    【解决方案1】:

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

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

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

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

    Java Persistence with Hibernate 参考中所述:

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

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

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

    【讨论】:

    • 我必须更新超过一百万条记录,如果我使用代理键,那么我必须对所有记录进行选择和更新。有什么方法可以提高性能?
    • 更新一百万条记录听起来你可能想在没有休眠的情况下这样做。