Как вы обрабатываете равенство объектов для java-объектов, управляемых спящим режимом? В книге "Спящий режим в действии" они говорят, что нужно отдавать предпочтение бизнес-ключам над суррогатными ключами.
В большинстве случаев у меня нет бизнес-ключа. Подумайте о адресах, сопоставленных с человеком. Адреса хранятся в наборе и отображаются в Wicket RefreshingView (с помощью стратегии ReuseIfEquals).
Я мог либо использовать суррогатный идентификатор, либо использовать все поля в функциях equals() и hashCode().
Проблема в том, что эти поля изменяются в течение жизни ob объекта. Либо потому, что пользователь ввел некоторые данные или изменения идентификатора из-за слияния JPA(), вызванного внутри фильтра OSIV (Open Session in View).
Мое понимание контракта equals() и hashCode() заключается в том, что они не должны меняться в течение всего жизненного цикла объекта.
Что я пробовал до сих пор:
- equals() на основе hashCode(), который использует идентификатор базы данных (или super.hashCode(), если id равен null). Проблема: новые адреса начинаются с нулевого идентификатора, но получают идентификатор, когда он привязан к человеку, и этот человек объединяется() (повторно присоединяется) в osiv-фильтр.
- lazy вычислить хэш-код при первом вызове hashCode() и сделать этот хэш-код @Transitional. Не работает, так как merge() возвращает новый объект, а hashcode не копируется.
Мне нужен идентификатор, который присваивается при создании объекта, я думаю. Какие здесь варианты? Я не хочу вводить некоторые дополнительные постоянные свойства. Есть ли способ явно указать JPA для назначения идентификатора объекту?
Привет