在Hibernate中存储在Set中时,equals()和hashCode()

Dan*_*iel 4 java hibernate jpa

在第4.3章的Hibernate文档中." 实现equals()和hashCode() "他们写了这句话:

"此外,如果一个实例未保存并且当前在一个Set中,保存它将为该对象分配一个标识符值.如果equals()hashCode()基于标识符值,则哈希码将改变,违反合同集."

我不明白它打破了什么合同以及可以从中获得什么问题.

Boz*_*zho 10

HashSet(后盾HashMap,如果对象的散列码不改变)的作品.那是因为它基于他们的哈希码来保存它们.

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

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

还要检查这个问题,了解您的选择hashCode()equals(..)