Это классическая проблема без теоретического решения, но есть практические способы ее решения.
Позвольте мне взять несколько строк из статьи ;
Проблема связана с различиями между идентификацией объекта в виртуальной машине (VM) и идентификацией объекта в базе данных. В виртуальной машине вы не получите идентификатор для объекта; вы просто держите прямые ссылки на объект. За кулисами виртуальная машина назначает восьмибайтовый идентификатор, который и является ссылкой на объект. Проблемы начинаются, когда вы сохраняете объект в базе данных. Допустим, вы создали объект Person и сохранили его в базе данных (person1). Где-то еще в вашем коде вы читаете данные Person и создаете новый объект Person (person2). Теперь у вас есть два объекта в памяти, которые отображаются на одну и ту же строку в базе данных. Ссылка на объект может указывать только на одну или другую, но нам нужен способ показать, что это действительно одна и та же сущность. Вот где приходит личность объекта.
То, что вы должны сделать, это просто, переопределить equals()
и hashcode()
в соответствии с бизнес-функциями сущностей.
Вот предлагаемое решение с форума hibernate статья ;
Разделение идентификатора объекта и бизнес-ключа
Чтобы избежать этой проблемы, мы рекомендуем использовать «полу» -уникальные атрибуты вашего постоянного класса для реализации equals () (и hashCode ()). По сути, вы должны думать, что идентификатор вашей базы данных вообще не имеет делового значения (помните, что в любом случае рекомендуется использовать атрибуты суррогатного идентификатора и автоматически сгенерированные значения). Свойство идентификатора базы данных должно быть только идентификатором объекта и в основном должно использоваться только Hibernate. Конечно, вы также можете использовать идентификатор базы данных в качестве удобного дескриптора, доступного только для чтения, например, строить ссылки в веб-приложениях.