powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильный подход с реализацией equals/hashCode ?
25 сообщений из 43, страница 1 из 2
Правильный подход с реализацией equals/hashCode ?
    #38803528
junixar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый раз натыкаюсь на этот вопрос и до сих пор не выработал для себя правильного (идеального) подхода.

Итак, речь идёт о доменных объектах, которые хранятся в БД, имеют первичный ключ и набор атрибутов. Первичный ключ генерирует БД при вставке объекта.

Никакого уникального неизменного атрибута сущность не имеет.

Как правильнее реализовать equals/hashCode?

Известные недостатки в известных подходах:

1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён.
2. Использовать все атрибуты, кроме id. Плохо тем, что на протяжении жизни объекта значения атрибутов могут измениться и соответственно изменится результат работы equals/hashCode. Это нарушает контракт данных методов и потенциально ведёт к проблемам в runtime.
3. Использовать искусственный уникальный неизменяемый атрибут. Плохо тем, что нужно этот атрибут явно определить, задавать значение и хранить в БД

Может есть более красивые подходы?
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803565
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junixar1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён.

equals() определяет предикат равенства двух объектов на уровне логики вашего приложения.
В него вовсе не обязан входить Id. В него даже не обязаны входить все поля. Это вопрос
смысла а не шаблона или подхода. Два физ-лица когда равны? Когда равны два платежа?

Еще раз. Смотрите в корень. В логику.

По hashCode() - что говорить. Возьмите исходники JDK. Посмотрите как он уже реализован
для String, Date, java.awt.Dimention, Long. Если непонятно - спрашивайте. Поясню.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803580
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junixar1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён.

Определяйте. UUID, например. Реально поможет много где.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803585
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junixar1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён.

Ну, как вариант использовать натуральный ключ. Важно только на него констрейнт в базе иметь.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803627
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junixarМожет есть более красивые подходы?
- попробовать ничего не делать))
Как раз хибер имеет доп.атрибут - версия.
И сам обеспечивает изоляцию объектов между сессиями
авторобъект=строка_в_БД_на_основе_PK
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803628
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junixar,

А как насчет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public boolean equals(Object toCompare){
         ...
         if(this.id != null && toCompare.id != null){
                ...сравниваем по id
         }else{
                ...сравниваем по полям
         }

}


?
Ну и сделать соответствующий hashcode.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803635
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БД вовсе не обязывает иметь таблицы с PK. Яркий пример - logging tables,
staging tables, temporary tables.

Я сам с позиции сторонника правильной реляционной алгебры с этим не согласен
но по факту в продуктивных системах таких таблиц много. И их существование
имеет свои аргументы.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803638
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
не вижу, зачем такой гемор?
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803647
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что не видишь?
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803650
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
зачем в продуктиве табличка без PK).
Ну, если, окромя это свалка лога в виде кучи записей.
Тогда это - off
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803658
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

я приведу просто - типичные DDL скриптики.и

Типпичный лог
Код: plsql
1.
SQL> create myFuckenLogTable(ts TIMESTAMP,eventType NUMBER,event VARCHAR2(255)) [interval partitioning options by ts ];



Типичная загрузка. Таблица - одноразовая. Создаётся только для заливки из внешних источников. Потом грохается.

Код: plsql
1.
SQL> create myFuckenStageTable2014_11_12 as select * from businessFactsTable where 1=0;



И зачем здесь PK ?
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803683
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
imho - тут не нужен.
Для ТС и сабжа - нужен.
Тогда и вопрос ТС отпадёт сам собой.
)
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803707
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор пишет что до момента вставки в БД, id еще не определён.

Это от скудности опыта. Я не знаю какой стек технологий он использует
но в Oracle, генерация суррогатных ПК никак не связана со вставкой.

Вы получаете его значение как Sequence_name.nextval и оно 100% уникально
в рамках системы. Дальше - используете его как хотите. Вставляйте сразу ID,
а потом обновляйте филды или вставляйте вместе. Вобщем либерально.

А про хибернейты меньше надо читать. Они только портят общее понимание
как работает БД.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803710
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123зачем в продуктиве табличка без PK).

Ну если админы смотрят на тебя сурово и говорят "какой суррогатный ключ? Ты что, охренел? Лярд записей и у каждой суррогатный ключ? Удалить! Что за индекс на три поля? Что значит PK хочется? Обойдись двумя, нафиг уникальность".

Вот и получается, что у таблицы нет первичного ключа...

PS: взаимоотношение адми-прогер какое уж есть.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803718
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Томин выступил несколько утрированно но в целом верно. Программист не кодит
сферические вещи в вакууме. Каждая хотелка имеет свою цену и перед
тем как ее создать надо посчитать сколько под нее купить
винчестерОв-процессорОв-стриммерОв... e.t.c.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803733
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нет PK, не понятно, как запись идентифицировать. При delete например

Пример с таблицей логов лично для меня не показатель. Если таймп стемп не может повторяться - он пк, если может, быстро подряд сформировавшиеся сообщения могут быть прочитаны в другом порядке - получаем не лог, а охинею. Т.ч. я бы тоже туда ID или номер по порядку добавил бы.

Я в целом, если без ПК живете хорошо - ну живите, мешать не буду. Но для меня таблица без ПК как-то нонсенс )))
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803744
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЕсли нет PK, не понятно, как запись идентифицировать.
коротко - никак))
...
PL Developer, жмём кнопку - Редактировать - пишет: "Добавьте в запрос поле rowid иначе не смогу"
))
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803772
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При просмотре событий во времени обычно не стоит задачи идентификации "точки" на оси времени. Время
как мы с вами помним из курса физики - величина непрерывная.

Берут обычно интервал. Например от текущего времени и до суток назад. И спокойно смотрят события с order-by ts.

А точность TIMESTAMP задаётся до 10 знаков после запятой. Как вы понимаете трудно создать процесс который
генерит события дважды за 0.0000000001 s.

Вопрос добавления доп. ключа типа sequence к timestamp для меня остаётся открытым. Я не знаю зачем мне нужен
и какую пользу я получаю от этого.

Вобщем это лучше обсудить с Ораклоидами . Накидают больше советов чем я.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803810
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА точность TIMESTAMP задаётся до 10 знаков после запятой. Как вы понимаете трудно создать процесс который
генерит события дважды за 0.0000000001 s....
Это если Вы поштучно в таблицу добавляете

А пусть у Вас на логе затык, и я хочу лог накапливать в своем буффере и потом в базу кидать одним bulk insert? Если код на Java, C то сгенерить соседние записи лога быстрее, чем например оттикает currentTimeMillis - легко.

А в целом, просто личные привычки. Спорить не буду.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803821
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не спорь. Просто расскажи что тебе даст второй суррогат ID в данном кейсе.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803830
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ не спорь. Просто расскажи что тебе даст второй суррогат ID в данном кейсе.
хотя бы order by

что бы лог читать в том же порядке, в котором я его генерил (принимаем, что поле timestamp может быть не уникальное. Пусть по причине кривых рук разработчика log'а)

Если, же, поле timestamp уникально, то тогда уверять, что в данной таблицы "нет PK" странно )))
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803833
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА точность TIMESTAMP задаётся до 10 знаков после запятой. Как вы понимаете трудно создать процесс который
генерит события дважды за 0.0000000001 s. System.nanoTime() :This method provides nanosecond precision, but not necessarily nanosecond resolution (that is, how frequently the value changes)С десятью знаками timestamp - тоже самое.
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803836
junixar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonequals() определяет предикат равенства двух объектов на уровне логики вашего приложения.
В него вовсе не обязан входить Id. В него даже не обязаны входить все поля. Это вопрос
смысла а не шаблона или подхода. Два физ-лица когда равны? Когда равны два платежа?

Если вы поместите физ.лицо в Map, а затем у физ. лица изменится хотя бы один атрибут, входящий в equals, то вы его потом просто не найдёте. Уникальных несуррогатных атрибутов у физ. лица нет. Хотя бы потому, что любой атрибут мог быть вбит оператором неправильно и потребует корректировки оператором.

maytonЕще раз. Смотрите в корень. В логику.

Хорошо. Куда именно то смотреть? Явного уникального несуррогатного атрибута нет. И?

maytonПо hashCode() - что говорить. Возьмите исходники JDK. Посмотрите как он уже реализован
для String, Date, java.awt.Dimention, Long. Если непонятно - спрашивайте. Поясню.

Много раз видел, как он там реализован. Пояснений не требуется. Только по контракту значение hashCode не может изменяться за время жизни объекта. И что дальше? Какие атрибуты использовать для hashCode у физ. лица?
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803841
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТиппичный лог
Код: plsql
1.
SQL> create myFuckenLogTable(ts TIMESTAMP,eventType NUMBER,event VARCHAR2(255)) [interval partitioning options by ts ];



В многопользовательской системе, хорошо бы как-то по user'ам / или на крайняк процессам-сессиям разделять

А то если два пользователя одновременно работать будет - такая помойка получится )))
...
Рейтинг: 0 / 0
Правильный подход с реализацией equals/hashCode ?
    #38803844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevmaytonИ не спорь. Просто расскажи что тебе даст второй суррогат ID в данном кейсе.
хотя бы order by

что бы лог читать в том же порядке, в котором я его генерил (принимаем, что поле timestamp может быть не уникальное. Пусть по причине кривых рук разработчика log'а)

Если, же, поле timestamp уникально, то тогда уверять, что в данной таблицы "нет PK" странно )))
Не забывайте что речь идёт о самом банальном логе. Мы не фиксируем туда bulk-операции
в порядке поступления ВСЕХ данных. Мы не агрегируем логи с облака серверов. Мы не накапливаем
гигабитный трафик пакетов.

Мы просто фиксируем чортовы события. Юзер залогонился. Юзер оплатил счёт. Вышел. Как в 99.9% системах.

Если у вас действительно есть постановка в которой происходит тот ужас который я перечислил то
это не является логом. И к нему моя схема - неприменима.

Вот как-то в таком вот аспекте.
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильный подход с реализацией equals/hashCode ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]