实体管理器如何在 JPA 中使用 hashcode 和 equals

How entity manager uses hashcode and equals in JPA

我有一个带有 JPA 的标准 JEE 应用程序。在合并以前分离的实体时,实体管理器是否使用 equalshashcode 来查找我合并的对象是否已被管理?一般当entity manager用hashcode还是equals?这是否受到我使用的 JPA 引擎的影响,例如 HibernateEclipse Link

要计算实体的状态,Hibernate 使用 Dirty checking

有脏检查

By default Hibernate checks all managed entity properties. Every time an entity is loaded, Hibernate makes an additional copy of all entity property values. At flush time, every managed entity property is matched against the loading-time snapshot value.

脏检查是通过检查加载时保存的所有 属性 值 来执行的。

equalshashcodeentitymanager 在 Hibernate 中的内部工作方式没有关系。

这取决于实现,但使用实体哈希码或 equals 方法对于任何 JPA 机制都不是那么可靠。 EclipseLink 不使用您的 equals 或 hashcode 实现来执行查找或比较 - 它会在需要 hashcode 时使用 System.identityHashCode。

不正确或低效的哈希码和相等方法仍然会对您的应用程序产生不利影响,尤其是在使用集合类型的映射中。我建议您不要在没有非常需要的情况下覆盖它们。