|
|
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Каждый раз натыкаюсь на этот вопрос и до сих пор не выработал для себя правильного (идеального) подхода. Итак, речь идёт о доменных объектах, которые хранятся в БД, имеют первичный ключ и набор атрибутов. Первичный ключ генерирует БД при вставке объекта. Никакого уникального неизменного атрибута сущность не имеет. Как правильнее реализовать equals/hashCode? Известные недостатки в известных подходах: 1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён. 2. Использовать все атрибуты, кроме id. Плохо тем, что на протяжении жизни объекта значения атрибутов могут измениться и соответственно изменится результат работы equals/hashCode. Это нарушает контракт данных методов и потенциально ведёт к проблемам в runtime. 3. Использовать искусственный уникальный неизменяемый атрибут. Плохо тем, что нужно этот атрибут явно определить, задавать значение и хранить в БД Может есть более красивые подходы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 14:19 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
junixar1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён. equals() определяет предикат равенства двух объектов на уровне логики вашего приложения. В него вовсе не обязан входить Id. В него даже не обязаны входить все поля. Это вопрос смысла а не шаблона или подхода. Два физ-лица когда равны? Когда равны два платежа? Еще раз. Смотрите в корень. В логику. По hashCode() - что говорить. Возьмите исходники JDK. Посмотрите как он уже реализован для String, Date, java.awt.Dimention, Long. Если непонятно - спрашивайте. Поясню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 14:32 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
junixar1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён. Определяйте. UUID, например. Реально поможет много где. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 14:37 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
junixar1. Использовать id. Плохо тем, что до момента вставки в БД id ещё не определён. Ну, как вариант использовать натуральный ключ. Важно только на него констрейнт в базе иметь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 14:38 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
junixarМожет есть более красивые подходы? - попробовать ничего не делать)) Как раз хибер имеет доп.атрибут - версия. И сам обеспечивает изоляцию объектов между сессиями авторобъект=строка_в_БД_на_основе_PK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:03 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
junixar, А как насчет: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ? Ну и сделать соответствующий hashcode. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:03 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
БД вовсе не обязывает иметь таблицы с PK. Яркий пример - logging tables, staging tables, temporary tables. Я сам с позиции сторонника правильной реляционной алгебры с этим не согласен но по факту в продуктивных системах таких таблиц много. И их существование имеет свои аргументы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:05 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
mayton, не вижу, зачем такой гемор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:07 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Что не видишь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:12 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
mayton, зачем в продуктиве табличка без PK). Ну, если, окромя это свалка лога в виде кучи записей. Тогда это - off ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:15 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Petro123, я приведу просто - типичные DDL скриптики.и Типпичный лог Код: plsql 1. Типичная загрузка. Таблица - одноразовая. Создаётся только для заливки из внешних источников. Потом грохается. Код: plsql 1. И зачем здесь PK ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:21 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
mayton, imho - тут не нужен. Для ТС и сабжа - нужен. Тогда и вопрос ТС отпадёт сам собой. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:30 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Автор пишет что до момента вставки в БД, id еще не определён. Это от скудности опыта. Я не знаю какой стек технологий он использует но в Oracle, генерация суррогатных ПК никак не связана со вставкой. Вы получаете его значение как Sequence_name.nextval и оно 100% уникально в рамках системы. Дальше - используете его как хотите. Вставляйте сразу ID, а потом обновляйте филды или вставляйте вместе. Вобщем либерально. А про хибернейты меньше надо читать. Они только портят общее понимание как работает БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:44 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Petro123зачем в продуктиве табличка без PK). Ну если админы смотрят на тебя сурово и говорят "какой суррогатный ключ? Ты что, охренел? Лярд записей и у каждой суррогатный ключ? Удалить! Что за индекс на три поля? Что значит PK хочется? Обойдись двумя, нафиг уникальность". Вот и получается, что у таблицы нет первичного ключа... PS: взаимоотношение адми-прогер какое уж есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:45 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Томин выступил несколько утрированно но в целом верно. Программист не кодит сферические вещи в вакууме. Каждая хотелка имеет свою цену и перед тем как ее создать надо посчитать сколько под нее купить винчестерОв-процессорОв-стриммерОв... e.t.c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:49 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Если нет PK, не понятно, как запись идентифицировать. При delete например Пример с таблицей логов лично для меня не показатель. Если таймп стемп не может повторяться - он пк, если может, быстро подряд сформировавшиеся сообщения могут быть прочитаны в другом порядке - получаем не лог, а охинею. Т.ч. я бы тоже туда ID или номер по порядку добавил бы. Я в целом, если без ПК живете хорошо - ну живите, мешать не буду. Но для меня таблица без ПК как-то нонсенс ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 15:56 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЕсли нет PK, не понятно, как запись идентифицировать. коротко - никак)) ... PL Developer, жмём кнопку - Редактировать - пишет: "Добавьте в запрос поле rowid иначе не смогу" )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:00 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
При просмотре событий во времени обычно не стоит задачи идентификации "точки" на оси времени. Время как мы с вами помним из курса физики - величина непрерывная. Берут обычно интервал. Например от текущего времени и до суток назад. И спокойно смотрят события с order-by ts. А точность TIMESTAMP задаётся до 10 знаков после запятой. Как вы понимаете трудно создать процесс который генерит события дважды за 0.0000000001 s. Вопрос добавления доп. ключа типа sequence к timestamp для меня остаётся открытым. Я не знаю зачем мне нужен и какую пользу я получаю от этого. Вобщем это лучше обсудить с Ораклоидами . Накидают больше советов чем я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:13 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
maytonА точность TIMESTAMP задаётся до 10 знаков после запятой. Как вы понимаете трудно создать процесс который генерит события дважды за 0.0000000001 s.... Это если Вы поштучно в таблицу добавляете А пусть у Вас на логе затык, и я хочу лог накапливать в своем буффере и потом в базу кидать одним bulk insert? Если код на Java, C то сгенерить соседние записи лога быстрее, чем например оттикает currentTimeMillis - легко. А в целом, просто личные привычки. Спорить не буду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:39 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
И не спорь. Просто расскажи что тебе даст второй суррогат ID в данном кейсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:46 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
maytonИ не спорь. Просто расскажи что тебе даст второй суррогат ID в данном кейсе. хотя бы order by что бы лог читать в том же порядке, в котором я его генерил (принимаем, что поле timestamp может быть не уникальное. Пусть по причине кривых рук разработчика log'а) Если, же, поле timestamp уникально, то тогда уверять, что в данной таблицы "нет PK" странно ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:50 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
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 - тоже самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:50 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
maytonequals() определяет предикат равенства двух объектов на уровне логики вашего приложения. В него вовсе не обязан входить Id. В него даже не обязаны входить все поля. Это вопрос смысла а не шаблона или подхода. Два физ-лица когда равны? Когда равны два платежа? Если вы поместите физ.лицо в Map, а затем у физ. лица изменится хотя бы один атрибут, входящий в equals, то вы его потом просто не найдёте. Уникальных несуррогатных атрибутов у физ. лица нет. Хотя бы потому, что любой атрибут мог быть вбит оператором неправильно и потребует корректировки оператором. maytonЕще раз. Смотрите в корень. В логику. Хорошо. Куда именно то смотреть? Явного уникального несуррогатного атрибута нет. И? maytonПо hashCode() - что говорить. Возьмите исходники JDK. Посмотрите как он уже реализован для String, Date, java.awt.Dimention, Long. Если непонятно - спрашивайте. Поясню. Много раз видел, как он там реализован. Пояснений не требуется. Только по контракту значение hashCode не может изменяться за время жизни объекта. И что дальше? Какие атрибуты использовать для hashCode у физ. лица? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:53 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
maytonТиппичный лог Код: plsql 1. В многопользовательской системе, хорошо бы как-то по user'ам / или на крайняк процессам-сессиям разделять А то если два пользователя одновременно работать будет - такая помойка получится ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:56 |
|
||
|
Правильный подход с реализацией equals/hashCode ?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevmaytonИ не спорь. Просто расскажи что тебе даст второй суррогат ID в данном кейсе. хотя бы order by что бы лог читать в том же порядке, в котором я его генерил (принимаем, что поле timestamp может быть не уникальное. Пусть по причине кривых рук разработчика log'а) Если, же, поле timestamp уникально, то тогда уверять, что в данной таблицы "нет PK" странно ))) Не забывайте что речь идёт о самом банальном логе. Мы не фиксируем туда bulk-операции в порядке поступления ВСЕХ данных. Мы не агрегируем логи с облака серверов. Мы не накапливаем гигабитный трафик пакетов. Мы просто фиксируем чортовы события. Юзер залогонился. Юзер оплатил счёт. Вышел. Как в 99.9% системах. Если у вас действительно есть постановка в которой происходит тот ужас который я перечислил то это не является логом. И к нему моя схема - неприменима. Вот как-то в таком вот аспекте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 16:58 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38803844&tid=2126277]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 444ms |

| 0 / 0 |
