实体管理器如何在 JPA 中使用哈希码和等于



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

要计算实体的状态,Hibernate使用脏检查。

带脏检查

默认情况下,Hibernate检查所有托管实体属性。每次加载实体时,Hibernate都会创建所有实体属性值的附加副本。在刷新时,每个托管实体属性都与加载时快照值匹配。

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

equalshashcode与 Hibernate 内部entitymanager的工作方式没有任何关系。

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

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

最新更新