每个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();
答案 0 :(得分:0)
分离和附加依赖于@id。不要依赖错误的答案,正确的答案是你提供的链接中的第二个(由菲尔写的)。
如果实体将在集合中使用(这是非常常见的) AND ,实体将与其分离,并随后重新附加,您只需要覆盖equals()和hashcode() to,hibernate sessions(这是一种不常见的hibernate用法)。
- 打算将持久化类的实例放在一个Set中(推荐的表示多值关联的方式); 和强>
- 打算使用重新附加的分离实例
这意味着如果您打算重新附加存储在父实体中的Set中的实体。 因此,只有两个条件同时为真时,hibernate才需要Hashcode和Equals实现。
当您使用复合主键时,实现equals和hashCode也是一个好主意,因为它是在composite id section中编写的