У меня была эта ошибка много раз, и ее может быть довольно сложно отследить ...
По сути, спящий режим говорит о том, что у вас есть два объекта с одинаковым идентификатором ( тот же первичный ключ), но это не один и тот же объект.
Я бы посоветовал вам разбить свой код, то есть закомментировать биты, пока ошибка не исчезнет, а затем вернуть код, пока он не вернется, и вы должны найти ошибку. .
Чаще всего это происходит через каскадные сохранения, когда между объектом A и B существует каскадное сохранение, но объект B уже связан с сеансом, но не в том же экземпляре B.
Что такое генератор первичного ключа вы используете?
Причина, по которой я спрашиваю, заключается в том, что эта ошибка связана с тем, как вы указываете спящему режиму определить постоянное состояние объекта (т.е. является ли объект постоянным или нет). Ошибка могла возникнуть из-за того, что спящий режим пытается сохраниться и объект уже является постоянным. Фактически, если вы используете save, hibernate попытается сохранить этот объект, и, возможно, уже существует объект с таким же первичным ключом, связанный с сеансом.
Пример
Предполагая, что у вас есть объект класса hibernate для таблицы с 10 строк на основе комбинации первичных ключей (столбец 1 и столбец 2). Итак, в какой-то момент вы удалили из таблицы 5 строк. Теперь, если вы снова попытаетесь добавить те же 10 строк, пока спящий режим пытается сохранить объекты в базе данных, 5 строк, которые уже были удалены, будут добавлены без ошибок. Теперь оставшиеся 5 строк, которые уже существуют, вызовут это исключение.
Правильно ли сопоставлены ваши идентификаторы? Если база данных отвечает за создание Id через идентификатор, вам необходимо сопоставить свой объект пользователя с этим ..
Еще одна вещь, которая сработала для меня, заключалась в том, чтобы сделать переменную экземпляра Long вместо long
У меня была переменная первичного ключа long id;
меняем его на Long id; работал
Всего наилучшего
Получить объект внутри сеанса, вот пример:
MyObject ob = null;
ob = (MyObject) session.get(MyObject.class, id);