equals () и hashCode () при хранении в наборе в Hibernate - PullRequest
4 голосов
/ 01 мая 2011

В документации Hibernate в главе 4.3. " Реализация equals () и hashCode () " они написали это предложение:

"Кроме того, если экземпляр является несохраненным и в настоящее время находится в наборе, при сохранении он присваивает объекту значение идентификатора. Если основаны equals () и hashCode () на значении идентификатора хеш-код изменился бы, нарушая контракт набора. "

Я не понимаю, какой контракт он нарушает и какие у него могут возникнуть проблемы.

1 Ответ

10 голосов
/ 01 мая 2011

a HashSet (поддерживается HashMap) работает, если хеш-коды объектов не меняются. Это потому, что он держит их на основе их хеш-кодов.

Таким образом, если вы основываете hashCode() на идентификаторе и помещаете сущности без идентификатора, все они будут иметь одинаковый хеш-код. Который, если они также equal(..) (какими они будут), не позволит использовать более одного объекта в наборе.

Теперь, если в наборе есть несколько сущностей с присвоенным идентификатором и одна без, которая впоследствии сохраняется, тогда для множества будет неправильный хеш-код.

Также проверьте этот вопрос , какие варианты вы можете выбрать hashCode() и equals(..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...