Ошибка: org.hibernate.exception.ConstraintViolationException: не удалось выполнить пакетное обновление JDBC
java.sql.BatchUpdateException: повторяющаяся запись "24-0-es_reservation_detail" для ключа "questionId_referenceId_referenceType"
Я собираюсь сохранить объект бронирования. Этот объект бронирования содержит коллекцию объектов reservaitonDetails, а каждый объект сведений о бронировании содержит коллекцию объектов questionAnswers.
Основная проблема заключается в уникальном ограничении таблицы questionAnswer.
Unqiue Constraint: question_id, reference_id, reference_type.
Когда система сохраняет объект резервирования: система сначала сохраняет резервирование, затем собирает детали резервирования, а затем ответы на все вопросы с 0 (reference_id). При добавлении вопроса с идентификатором ссылки 0 система выдает исключение, поскольку нарушается уникальное ограничение.
ReservationDetail.hbm.xml
.............
.............
<set name="questionAnswers" lazy="true" cascade="all-delete-orphan" where="reference_type = 'es_reservation_detail'">
<key column="reference_id"/>
<one-to-many class=".....QuestionAnswerDTO" />
</set>
.............
.............
Пример:
Если мы сохраним сбор в деталях бронирования
1. insert into reservation......... (reservation id = 1)
2. insert into reservation_detail....... (reservation detail id = 1)
3. insert into reservation_detail....... (reservation detail id = 2)
4. insert into question_answer..... (referece_type='RD' referece_id=0, question_id =1) - For Reservation Detail id = 1
5. insert into question_answer..... (referece_type='RD' referece_id=0, question_id =1) - For Reservation Detail id = 1
6. update reservation_detail set reservation_id = ? where reservation_detail_id = ? (reservation_id = 1, reservation_detail_id = 1)
7. update reservation_detail set reservation_id = ? where reservation_detail_id = ? (reservation_id = 1, reservation_detail_id = 2)
8. update question_answer set reference_id = ? where question_answer_id = ? (reference_id = 1 and question_answer_id =1)
9. update question_answer set reference_id = ? where question_answer_id = ? (reference_id = 2 and question_answer_id =2)
Когда система выполнит пункт (5) скрипта. Система будет через исключение нарушения ограничений.
Есть ли какой-нибудь способ, которым спящий режим обновляет reference_id в question_answer (таблице) непосредственно перед созданием следующего запроса на вставку.
Сценарий 8 должен запускаться после 4-го сценария
Скрипт 9 должен запускаться после 5-го сценария