В равных и хэш-код или нет на классах сущностей, это вопрос - PullRequest
6 голосов
/ 18 декабря 2009

Я пытался рассуждать о том, как лучше всего разобраться, является ли вообще хорошей практикой реализация хэш-кода и равных для сущностей (я имею в виду сущность в общем смысле, но в большинстве случаев это будет сущность JPA).

В главе 24 руководства Hibernate http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html сказано это ...

Определите естественные ключи для всех сущности, и сопоставьте их, используя , Реализуйте equals () и hashCode () для сравнения свойств которые составляют естественный ключ.

Имеет смысл, чтобы .equals и .hashcode включали только эти естественные ключи, но что, если у вас более одного экземпляра одного и того же объекта (один и тот же естественный идентификатор, таким образом, один и тот же хэш-код)? Кажется, что эта практика может иметь тонкие последствия в других местах вашего приложения. Кто-нибудь пробовал это раньше в больших масштабах?

Ответы [ 2 ]

6 голосов
/ 18 декабря 2009

Я пробовал это раньше в больших масштабах (или, по крайней мере, в приложении, которое интенсивно использует спящий режим). Это хорошая идея.

Имеет смысл, чтобы .equals и .hashcode включали только эти естественные ключи, но что если у вас более одного экземпляра одного и того же объекта (один и тот же естественный идентификатор, таким образом, один и тот же хэш-код)? Кажется, что эта практика может иметь тонкие последствия в других местах вашего приложения.

Это то, для чего он предназначен. Вы обычно хотите, чтобы несколько экземпляров одного и того же объекта были успешными при сравнении .equals, и да, это имеет значение в других местах. ИМО эти последствия заключаются в том, что все будет работать, как ожидалось.

3 голосов
/ 18 декабря 2009

Бывают моменты, когда вы хотите, чтобы Equals сравнивал все свойства, и времена, когда вы хотите, чтобы Equals был просто ключом. Мы добились гораздо большего успеха, используя явные вспомогательные классы, поэтому нет никакой двусмысленности относительно того, что сравнивается.

ByKeyComparer.Equals...
ByPropertiesComparer.Equals...

или

Entity1.EqualsByKey...
Entity1.EqualsByProperties...
...