什么时候在hibernate下需要Hashcode和Equals实现?

时间:2014-03-04 12:50:07

标签: java hibernate equals hashcode

每个Link

  

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

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

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

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

更新: - 要确认我尝试重新附加分离的实例,如下所示

   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();

1 个答案:

答案 0 :(得分:0)

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

  

如果实体将在集合中使用(这是非常常见的) AND ,实体将与其分离,并随后重新附加,您只需要覆盖equals()和hashcode() to,hibernate sessions(这是一种不常见的hibernate用法)。

正如hiberante documentation所说:

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

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

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