一尘不染

使用JPA和Hibernate时应如何实现equals和hashcode

hibernate

在Hibernate中应如何实现模型类的equals和hashcode?有哪些常见的陷阱?默认实现在大多数情况下是否足够好?使用商务钥匙有什么意义吗?

在我看来,要考虑到延迟获取,ID生成,代理等,在每种情况下都无法正确工作。


阅读 320

收藏
2020-06-20

共1个答案

一尘不染

Hibernate有何时/如何重写一个很好的和长期的描述equals()/
hashCode()文档

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

  1. 基于equals()/ hashCode()基于业务密钥-例如,在对象(或至少会话)生存期内不会改变的属性的唯一组合。
  2. 如果以上操作均不可行,请在设置了主键的情况下基于equals()/ hashCode()设置主键,System.identityHashCode()否则以对象标识为基础。这里的 重要 部分是您需要在将新实体添加到其中并保留后 重新加载 Set;否则,您可能会遇到奇怪的行为(最终导致错误和/或数据损坏),因为您的实体可能会分配给与当前桶不匹配的存储桶hashCode()
2020-06-20