Hibernate как предотвратить повторяющиеся записи с созданным идентификатором - PullRequest
1 голос
/ 24 марта 2011

Есть ли способ предотвратить повторный ввод данных с помощью гибернации на объектах, которые автоматически сгенерировали первичный ключ?

Чтобы быть более точным, у меня есть постоянный объект в базе данных, и у меня есть временный объект (еще не вставлен в базу данных), и эти два объекта одинаковы в отношении методов equals и hashcode. Но, поскольку идентификатор класса сущности этих объектов аннотируется сгенерированной аннотацией значения, hibernate по-прежнему создает новый экземпляр для временного объекта в базе данных. В результате в базе данных появляются повторяющиеся записи (по отношению к методам equals и hashcode) с разными первичными ключами.

Да, я знаю, если я сделаю ПК не сгенерированным автоматически, или если я использую UUID, тогда я достигну своей цели. Но я просто хочу спросить, почему методы equals и hashcode не работают для сущностей с автоматически сгенерированным первичным ключом? Или я что-то не так делаю?

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

почему методы equals и hashcode не работают

Hibernate не уважает equals() / hashCode() здесь, потому что нет эффективных способов сделать это.

Как Hibernate может проверить, что объект с такой же идентичностью (в терминах equals()) уже существует в базе данных? Поскольку equals() может содержать произвольные условия, Hibernate не может превратить его в запрос SQL, поэтому единственный способ проверить это - загрузить все объекты в память и вызвать equals() для них, чтобы сравнить их с объектом, который вы собираетесь сохранить.

Поэтому Hibernate использует первичные ключи для определения идентичности объектов.

Или я что-то не так делаю?

Не ясно, чего вы собираетесь достичь. Если вы хотите, чтобы Hibernate обновлял объекты в базе данных в соответствии с состоянием передаваемых вами объектов, вам нужно использовать merge().

Смотри также:

2 голосов
/ 24 марта 2011

Ваш первичный ключ на уровне базы данных должен использовать те же поля, которые вы используете для проверки на равенство на уровне приложения. Если вам действительно нужен суррогатный ключ (возможно, по соображениям производительности), принудительно установите «уникальный индекс» для этих полей и разрешите hibernate-исключение и исключение.

0 голосов
/ 24 марта 2011

Обеспечить ограничение на уровне БД. Без этого трудно (невозможно?) Избежать дублирования, особенно если ваше приложение кластеризовано.

...