使用 JPA 和 Hibernate 时应如何实现等于和哈希码

2022-08-31 09:53:41

如何在Hibernate中实现模型类的等式和哈希码?常见的陷阱是什么?在大多数情况下,默认实现是否足够好?使用业务密钥有什么意义吗?

在我看来,当考虑到懒惰获取,id生成,代理等时,很难在每种情况下都正确工作。


答案 1

Hibernate在文档中对何时/如何覆盖/有很好的详细描述equals()hashCode()

它的要点是,您只需要担心您的实体是否是a的一部分,或者如果您要分离/附加其实例。后者并不常见。前者通常最好通过以下方式处理:Set

  1. 基于 /基于业务键 - 例如,在对象(或至少会话)生存期内不会更改的唯一属性组合。equals()hashCode()
  2. 如果上述操作是不可能的,则基于 / 基于主键,如果已设置和对象标识/否则。这里重要的部分是,您需要在将新实体添加到集合并持久化后重新加载该集合;否则,您可能会遇到奇怪的行为(最终导致错误和/或数据损坏),因为您的实体可能被分配到与其当前存储桶不匹配的存储桶。equals()hashCode()System.identityHashCode()hashCode()

答案 2

我不认为接受的答案是准确的。

要回答原始问题:

在大多数情况下,默认实现是否足够好?

答案是肯定的,在大多数情况下确实如此。

您只需要覆盖并且实体将在(这是非常常见的)中使用,并且实体将从休眠会话中分离并随后重新附加到休眠会话(这是休眠的不常见用法)。equals()hashcode()Set

接受的答案指示如果一条件为真,则需要重写这些方法。


推荐