SPRING-SOURCE.RU

Идентификация объектов. Выбор первичных ключей

Идентификация объектов

Идентичные объекты - ссылки на объекты равны. Сравнение оператором ==
Одинаковые объекты - одинаковые с логической точки зрения, но при этом имеют разные области памяти. Сравнение методом equals.
Идентичные в терминах БД - объекты ссылаются на одну и ту же запись одной таблицы с одинаковым primary key.

Желательно использовать сурагатный первичный ключ - тот, который никак не соответствует бизнес логике.

Например, мы считываем из базы один и тот же ряд, в итоге мы получаем один объект и второй, то есть, из двух разных запросов мы полуаем два разных объекта. Представим себе, что в одном из объектов вы изменили информацию: поменяли телефон у пользователя. И пока еще ничего не сохраняли. Возникает вопрос: считать ли эти два объекта одинаковыми или нет? Если их сравнивать двумя равно, то объекты получаться разными (разные области памяти). Метод equals - смотря на то как мы его реализуем. Если начнем сравнивать логическую структуру объектов, то они опять будут разными, так как у них поменялось одно поле. Вопрос: как реализовать сравнение этих двух объектов? Ответ: суррогатный ключ. Никакого отношения к объекту этот ключ не должен иметь, его будет использовать только база данных. Тогда метод equals мы реализуем таким образом чтобы он сравнивал только этот ключ. Получается, что если ключ равен, то эти объекты одинаковые. Даже если в объектах будут меняться данные относящиеся к бизнес логике, например телефон, то при сравнении методом equals эти объекты будут равными.

Выбор первичных ключей

Управление первичными ключами лучше предоставить JPA.

@GeneratedValue (strategy = GenerationType.
AUTO - автоматический выбор
IDENTITY - алгоритм идентичности (возрастающий порядок, возможно с пустыми местами). Часто используется. Здесь id уникальные в пределах одной таблицы.
SEQUENCE - последовательный алгоритм
TABLE - используется дополнительная таблица для хранения последнего назначенного ключа.
)

Чтобы создать первичный ключ мы указываем аннотацию @id и рядом поставить @GeneratedValue, тогда id будет автоматически генерироваться (либо JPA, либо базой данных).

Переходим к связыванию объектов и отображение этих объектов в базу данных.