【问题标题】:How entity manager uses hashcode and equals in JPA实体管理器如何在 JPA 中使用 hashcode 和 equals
【发布时间】:2017-11-07 10:57:09
【问题描述】:

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

【问题讨论】:

  • EntityManager 根本不使用 hashCode/equals。它们由 java.util.Collection 类使用。
  • 如果实体已经被管理,实体管理器如何在合并过程中找到?
  • Collection.contains? EntityManager 知道它正在管理哪些对象
  • 就脏检查而言,那些使用字节码增强的人不需要去检查每个字段是否被更改,因为字节码会在字段更改时存储该信息跨度>
  • 这个问题似乎是您在寻找解决您在stackoverflow.com/questions/47091598/… 中遇到的问题的方法。如果您认为您的相等/哈希码实现导致了错误,那么删除这些方法并对其进行测试应该会更容易和有效。

标签: java hibernate jpa eclipselink


【解决方案1】:

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

带有脏检查

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 2011-07-08
      • 2010-12-10
      • 2011-03-09
      • 2011-05-22
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多