Здесь были несколько обсуждения об объектах JPA и реализация hashCode()
/equals()
должен использоваться для классов сущностей JPA. Большинство (если не все) из них зависят от Hibernate, но я бы хотел обсудить их с JPA-реализацией-нейтрально (кстати, я использую EclipseLink).
Все возможные реализации имеют свои собственные преимущества и недостатки относительно:
-
hashCode()
/equals()
Контракт соответствие (неизменяемость) для операцийList
/Set
- Можно обнаружить идентичные объекты (например, из разных сеансов, динамические прокси из ленивых загружаемых структур данных)
- Являются ли сущности правильными в состоянии (или не сохраняющемся)
Насколько я вижу, есть три параметра:
- Не переопределяйте их; полагайтесь на
Object.equals()
иObject.hashCode()
-
hashCode()
/equals()
работа - не может идентифицировать идентичные объекты, проблемы с динамическими прокси-серверами
- никаких проблем с отдельными объектами
-
- Переопределить их на основе первичного ключа
-
hashCode()
/equals()
нарушены - правильная идентификация (для всех управляемых объектов)
- проблемы с отдельными объектами
-
- Переопределить их на основе Бизнес-Id (поля непервичного ключа, а также о внешних ключах?)
-
hashCode()
/equals()
нарушены - правильная идентификация (для всех управляемых объектов)
- никаких проблем с отдельными объектами
-
Мои вопросы:
- Я пропустил опцию и/или про/точку подключения?
- Какой вариант вы выбрали и почему?
ОБНОВЛЕНИЕ 1:
В разделе "hashCode()
/equals()
сломаны", я имею в виду, что последовательные вызовы hashCode()
могут возвращать разные значения, которые (когда правильно реализованы) не нарушаются в смысле документации Object
API, но что вызывает проблемы при попытке получить измененный объект из Map
, Set
или другого хэш-основанного Collection
. Следовательно, реализация JPA (по крайней мере, EclipseLink) в некоторых случаях будет работать некорректно.
ОБНОВЛЕНИЕ 2:
Спасибо за ваши ответы - у большинства из них замечательное качество. К сожалению, я до сих пор не уверен, какой подход будет лучшим для реального приложения или как определить наилучший подход для моего приложения. Итак, я буду держать вопрос открытым и надеяться на еще несколько обсуждений и/или мнений.