我有一个带有JPA
的标准JEE
应用程序。在合并以前分离的实体时,实体管理器是否使用 equals
或 hashcode
来查找我合并的对象是否已被管理?通常当实体管理器使用hashcode
或equals
时?这是否受到我使用的 JPA 引擎的影响,例如Hibernate
或Eclipse Link
?
要计算实体的状态,Hibernate使用脏检查。
带脏检查
默认情况下,Hibernate检查所有托管实体属性。每次加载实体时,Hibernate都会创建所有实体属性值的附加副本。在刷新时,每个托管实体属性都与加载时快照值匹配。
脏检查是通过检查加载时保存的所有属性值来执行的。
equals
和hashcode
与 Hibernate 内部entitymanager
的工作方式没有任何关系。
这取决于实现,但对于任何 JPA 机制来说,使用实体哈希码或等于方法都不是那么可靠。 EclipseLink 不使用您的 equals 或 hashcode 实现来执行查找或比较 - 当需要哈希代码时,它将使用 System.identityHashCode。
但是,不正确或低效的哈希代码和相等方法仍会对应用程序产生不利影响,尤其是在使用集合类型的映射中。我建议您不要在没有大量需求的情况下覆盖它们。