实体管理器如何在 JPA 中使用 hashcode 和 equals
How entity manager uses hashcode and equals in JPA
我有一个带有 JPA
的标准 JEE
应用程序。在合并以前分离的实体时,实体管理器是否使用 equals
或 hashcode
来查找我合并的对象是否已被管理?一般当entity manager用hashcode
还是equals
?这是否受到我使用的 JPA 引擎的影响,例如 Hibernate
或 Eclipse 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.
脏检查是通过检查加载时保存的所有 属性 值 来执行的。
equals
和 hashcode
与 entitymanager
在 Hibernate 中的内部工作方式没有关系。
这取决于实现,但使用实体哈希码或 equals 方法对于任何 JPA 机制都不是那么可靠。 EclipseLink 不使用您的 equals 或 hashcode 实现来执行查找或比较 - 它会在需要 hashcode 时使用 System.identityHashCode。
不正确或低效的哈希码和相等方法仍然会对您的应用程序产生不利影响,尤其是在使用集合类型的映射中。我建议您不要在没有非常需要的情况下覆盖它们。
我有一个带有 JPA
的标准 JEE
应用程序。在合并以前分离的实体时,实体管理器是否使用 equals
或 hashcode
来查找我合并的对象是否已被管理?一般当entity manager用hashcode
还是equals
?这是否受到我使用的 JPA 引擎的影响,例如 Hibernate
或 Eclipse 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.
脏检查是通过检查加载时保存的所有 属性 值 来执行的。
equals
和 hashcode
与 entitymanager
在 Hibernate 中的内部工作方式没有关系。
这取决于实现,但使用实体哈希码或 equals 方法对于任何 JPA 机制都不是那么可靠。 EclipseLink 不使用您的 equals 或 hashcode 实现来执行查找或比较 - 它会在需要 hashcode 时使用 System.identityHashCode。
不正确或低效的哈希码和相等方法仍然会对您的应用程序产生不利影响,尤其是在使用集合类型的映射中。我建议您不要在没有非常需要的情况下覆盖它们。