Equals() и hashCode() в сущностях

В CUBA сущности тем или иным образом наследовали BaseGenericIdEntity, где были equals() и hashCode() в которых для вычисления брался id. Всё было понятно и ожидаемо.
В JMIX сущности мы аннотируем, не наследуем. И со “своими” сущностями всё понятно, я могу переопределить equals() и hashCode(). Но как быть с “системными”, например, RoleAssignmentEntity? Ни HashSet, ни HashMap “нормально” с ними не получиться организовать?

Возможно я ошибаюсь, но как я понимаю, когда вы добавляете аннотацию JmixEntity, jmix скрыто (видимо при компиляции) обновляет методы. К примеру в сеттеры добавляется листенер на обновление компонентов в ui. Так и equals с hashCode обновляются.

Можете найти класс: EntityEntry, посмотреть классы что от него отнаследованы.

Там вроде как все сущноcти jmix.

image

1 симпатия

Здравствуйте, Евгений!

Как верно указал Ярослав, equals и hashCode добавляются автоматически. Это происходит в jmix-плагине для gradle во время энхансинга сущностей.

Самостоятельно определять equals и hashCode в сущностях крайне нежелательно, поскольку при вмешивании в них бизнес логики или другом неаккуратном использовании это может нарушить работу внутренних механизмов, т.е. как раз сломать их хранение и обработку в контексте, где используются HashSet и HashMap.

Так же как и в CUBA, в Jmix эти методы полагаются на id, т.е. equals должен возвращать true тогда и только тогда, когда сравниваются два клона одного и того же экземпляра сущности, какие бы изменения в каждом из них не находились, что и реализовано в io.jmix.core.impl.EntityInternals#equals.

С уважением,
Дмитрий

@yarik1706 @taimanov спасибо! Теперь понятно.