Мне нравится использовать класс BaseDomain для всех объектов домена JPA. В базовом классе у меня есть идентификатор объекта, хранящийся в виде строки, сгенерированный из UUID.random(). ID объекта присваивается при создании объекта. Класс сущностей также имеет первичный ключ, назначаемый базой данных при сохранении.
До этого момента я всегда сохранял идентификатор объекта на основе строки. Это добавляет дополнительный столбец в каждую таблицу, но меня это не беспокоит.
Мне было интересно - есть ли причина сохранять идентификатор объекта (сгенерированный UUID)? Или случайный UUID должен оставаться в пространстве Java?
Я всегда основываю методы hashCode() и equals() класса домена на UUID, а не на первичном ключе. Это нормально, потому что UUID остается неизменным для данного объекта на протяжении всей его жизни, как в JVM, так и в базе данных.
Если я перестану сохранять UUID, как будут выглядеть методы hashCode() и equals()? Будет ли это похоже на двухуровневое сравнение: сначала с использованием первичного ключа, если он не равен нулю, а затем с использованием идентификатора объекта, если первичный ключ равен нулю?