Этот вопрос является продолжением вопросов:
Должен ли я писать методы equals () в сущностях JPA? и Какова лучшая практика при реализации equals () для сущностей с сгенерированными идентификаторами
Сначала фон ...
Вы можете регулярно встречать следующие первичные ключевые созвездия:
- Естественные ключи (бизнес-ключи): обычно набор реальных, многостолбцовых атрибутов сущности
- Искусственные ключи (суррогатные ключи): бессмысленные, обычно с автоинкрементом (IDENTITY, AUTO_INCREMENT, AUTOINCREMENT, SEQUENCE, SERIAL, ...) ID
- Гибридные ключи (полунатуральные / полусинтетические ключи): обычно состоят из искусственного идентификатора и некоторых дополнительных естественных столбцов, например любой таблицы, которая ссылается на другую таблицу, которая использует идентификатор и расширяет этот ключ (entity_id, ordinal_nbr ) или аналогичные.
Частый сценарий: многозначные ссылки на корневую, ветвь или таблицу наследования листьев, которые имеют общий «глупый» идентификатор посредством идентификации отношения / зависимого ключа.
Корневые (и ветвящиеся) таблицы часто имеют смысл, когда другая таблица должна ссылаться на все типы сущностей, например PostAddresses -> Контакты, где у контактов есть подстолы Персоны, Клубы,
и объекты, которые не имеют ничего общего, кроме того, что являются "контактными".
Теперь в JPA:
В Java мы можем создавать новые объекты сущностей, чей PK может быть неполным (нулевым или частично нулевым), сущность (строка), которую СУБД в конечном итоге не позволит нам вставить в БД.
Однако при работе с кодом приложения часто бывает удобно иметь новые (или отдельные) сущности, которые можно сравнивать с существующими (управляемыми) сущностями, даже если у новых сущностных объектов еще нет значения PK. Чтобы добиться этого для любых объектов, имеющих столбцы с естественным ключом, используйте их для реализации equals () и hashCode () (как предложено в двух других публикациях SO).
Вопрос:
Но что вы будете делать, когда невозможно определить натуральный / бизнес-ключ, как в случае с таблицей контактов, которая в основном представляет собой просто идентификатор (плюс дискриминатор)? Какова будет хорошая политика выбора столбцов для реализации реализаций equals () и hashCode ()? (искусственные ключи 2. и 3. выше)
Там явно не так много выбора ...
Одной (наивной) целью было бы достижение той же «переходной сопоставимости». Это можно сделать? Если нет, то как выглядит общий подход для реализаций искусственного идентификатора equals () и hashCode ()?
Примечание: Я уже использую Apache EqualsBuilder и HashCodeBuilder ... Я намеренно "наивизировал" мой вопрос.