Будьте в спящем режиме Ошибка: org.hibernate. NonUniqueObjectException: другой объект с тем же значением идентификатора был уже связан с сессией

104
задан tankucukoglu 8 July 2015 в 07:30
поделиться

4 ответа

У меня была эта ошибка много раз, и ее может быть довольно сложно отследить ...

По сути, спящий режим говорит о том, что у вас есть два объекта с одинаковым идентификатором ( тот же первичный ключ), но это не один и тот же объект.

Я бы посоветовал вам разбить свой код, то есть закомментировать биты, пока ошибка не исчезнет, ​​а затем вернуть код, пока он не вернется, и вы должны найти ошибку. .

Чаще всего это происходит через каскадные сохранения, когда между объектом A и B существует каскадное сохранение, но объект B уже связан с сеансом, но не в том же экземпляре B.

Что такое генератор первичного ключа вы используете?

Причина, по которой я спрашиваю, заключается в том, что эта ошибка связана с тем, как вы указываете спящему режиму определить постоянное состояние объекта (т.е. является ли объект постоянным или нет). Ошибка могла возникнуть из-за того, что спящий режим пытается сохраниться и объект уже является постоянным. Фактически, если вы используете save, hibernate попытается сохранить этот объект, и, возможно, уже существует объект с таким же первичным ключом, связанный с сеансом.

Пример

Предполагая, что у вас есть объект класса hibernate для таблицы с 10 строк на основе комбинации первичных ключей (столбец 1 и столбец 2). Итак, в какой-то момент вы удалили из таблицы 5 строк. Теперь, если вы снова попытаетесь добавить те же 10 строк, пока спящий режим пытается сохранить объекты в базе данных, 5 строк, которые уже были удалены, будут добавлены без ошибок. Теперь оставшиеся 5 строк, которые уже существуют, вызовут это исключение.

168
ответ дан 24 November 2019 в 04:07
поделиться

Правильно ли сопоставлены ваши идентификаторы? Если база данных отвечает за создание Id через идентификатор, вам необходимо сопоставить свой объект пользователя с этим ..

2
ответ дан 24 November 2019 в 04:07
поделиться

Еще одна вещь, которая сработала для меня, заключалась в том, чтобы сделать переменную экземпляра Long вместо long


У меня была переменная первичного ключа long id; меняем его на Long id; работал

Всего наилучшего

0
ответ дан 24 November 2019 в 04:07
поделиться

Получить объект внутри сеанса, вот пример:

MyObject ob = null;
ob = (MyObject) session.get(MyObject.class, id);
3
ответ дан 24 November 2019 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: