【发布时间】: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