Я столкнулся со следующей проблемой и не могу найти правильное решение. У меня есть отношение A с атрибутами id, x (внешний ключ), y (порядковый номер) и z (контент). Далее существует ограничение единственности на x-y. Обычно у меня есть кортежи типа (455, 159, 1,...), (456, 159, 2,...), (457, 159, 3,...) и т.д. Я использую Hibernate и это таблица отображения для определенного класса. Теперь у меня есть прецедент, где я хочу вставить новый объект или удалить уже существующий и обновить порядковые номера других объектов. Например, если я вставляю новый объект сразу после 1, он должен получить порядковый номер 2, а затем объект, который ранее был 2, должен стать 3, 3 должен стать 4 и т.д. Что-то подобное должно произойти при удалении объекта 2 - старого 3 должен затем стать 2 и т.д.
Однако при запуске обновления я получаю исключение ConstraintViolationException.
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
...
Caused by: java.sql.BatchUpdateException: Duplicate entry '159-2' for key 2
Я не могу объяснить, почему это происходит. Не существует фиксации фиксации/сеанса, поэтому я, хотя Hibernate/MySQL, сможет обрабатывать временную несогласованность и проверять ограничения на фиксацию. Есть ли что-то, что я пропускаю, или нет способа сделать это без серьезных обходных решений?
Приветствия
Некоторым генераторам идентификаторов нужно перейти непосредственно к БД, чтобы получить идентификатор.
Например, с помощью генератора native
с столбцом AUTOINCREMENT в MySQL при вызове save()
он выполнит вставку и извлечет идентификатор, даже если вы не совершили сеанс.
Попробуйте перейти к управляемому Hibernate генератору.