Java 在Hibernate中存储在集合中时等于()和hashCode()

Java 在Hibernate中存储在集合中时等于()和hashCode(),java,hibernate,jpa,Java,Hibernate,Jpa,在第4.3章的Hibernate文档中。“他们写了这样一句话: 此外,如果一个实例未保存且当前在一个集合中,保存它将为该对象分配一个标识符值。如果equals()和hashCode()基于标识符值,则哈希代码将更改,从而破坏集合的约定 我不明白它打破了什么合同,会带来什么问题 aHashSet(由HashMap支持)在对象的hashcode不变的情况下工作。这是因为它根据它们的哈希代码保存它们 因此,如果您将hashCode()基于标识符,并放置没有标识符的实体,则它们都将具有相同的哈希代码。如

在第4.3章的Hibernate文档中。“他们写了这样一句话:

此外,如果一个实例未保存且当前在一个集合中,保存它将为该对象分配一个标识符值。如果equals()和hashCode()基于标识符值,则哈希代码将更改,从而破坏集合的约定

我不明白它打破了什么合同,会带来什么问题

a
HashSet
(由
HashMap
支持)在对象的hashcode不变的情况下工作。这是因为它根据它们的哈希代码保存它们

因此,如果您将
hashCode()
基于标识符,并放置没有标识符的实体,则它们都将具有相同的哈希代码。如果它们也
相等(..)
(它们将相等),则不允许集合中有多个对象

现在,如果集合中有一些实体具有分配的标识符,而有一个实体没有分配的标识符(稍后保存),那么集合将具有错误的哈希代码

另外,请检查关于
hashCode()
equals(…)的选项。

在使用业务密钥方面有一些很好的答案,这将有助于避免这些问题。