【问题标题】:when Hashcode and Equals implementation is required under hibernate?hibernate下什么时候需要实现Hashcode和Equals?
【发布时间】:2014-04-06 00:23:21
【问题描述】:

每个Link

它的要点是,如果您的实体愿意,您只需要担心它 成为 Set(condition 1) 的一部分或/如果你要分离 /附加它的实例。(条件2)

根据我的理解,我们只需要条件 1,其中需要实现 hashcode 和 equals 方法

如果我有不想存储重复客户(基于客户名称)或检索重复客户的要求 来自休眠 apis 的客户(用于遗留数据),那么我的理解是在 set 下存储客户在这里确实有意义 这是我们需要实现 hashcode 和 equals 方法的唯一场景。

我不明白当我们要分离/附加它的实例(条件)时,hashcode 和 equal 实现是如何提供帮助的

更新:-为了确认我尝试重新连接分离的实例,如下所示

   person detached instance lying here for id 1// person overrides hashcode and equals method

   session = factory.openSession();
   tx = session.beginTransaction();
   person1=(Person)session.get(Person.class, 1);
   session.lock(person, LockMode.NONE);// reattaching the detached instance here
   // as per Marko Topolnik  comment i was expecting equality will be checked based on equals and hashcode 
   // method but it was done based on person id . so question is  does hashcode and equals come into picture
   // while reattaching the detached instance


   tx.commit();

【问题讨论】:

  • 分离和附加依赖于相等的定义。如果您重新附加会话中已存在的实例,则必须检测到该实例。会话中的实例存储在基于哈希表的结构中。
  • 不应该根据对象标识符重新附加吗?为了确认您的观点,当会话中已经存在另一个人员实例时,我使用锁定方法重新附加了人员实例。我期望相等性将基于哈希码和相等方法进行检查,但它是基于人员标识符和 org.hibernate.NonUniqueObjectException: 被抛出的。有什么线索吗?
  • Hibernate 不接触对象 Equals 或 hashcode 方法来确定相等性。它只关心你的 ID 字段的值。如果已经存在具有该 ID 的数据库实例,并且您尝试对该对象执行更新、删除或获取之外的任何操作,或者您尝试将具有该 ID 的对象附加到会话中,您将收到 NonUniqueObjectException。 Hibernate 不关心你的对象状态。
  • 因此,在使用会话重新附加分离的实例时,对象哈希码和等号不会出现。对吗?

标签: java hibernate equals hashcode


【解决方案1】:

分离和附加依赖于@id。不要依赖错误的答案,正确的答案是您提供的链接中的第二个答案(由 Phil 撰写)。

如果实体将在 Set 中使用(这很常见),您只需要覆盖 equals() 和 hashcode() AND 实体将从中分离并随后重新附加到,休眠会话(这是休眠的不常见用法)。

正如hiberante documentation 所说:

  • 打算将持久类的实例放在一个集合中(表示多值关联的推荐方式);
  • 打算使用分离实例的重新附加

这意味着如果您打算重新附加存储在父实体中的 Set 中的实体。 所以只有当两个条件同时为真时,才需要hibernate实现Hashcode和Equals。

此外,当您使用复合主键时,最好实现 equals 和 hashCode,因为它是在 composite id section 中编写的

【讨论】:

    猜你喜欢
    • 2012-02-23
    • 2012-10-19
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多