Error: org.hibernate.exception.ConstraintViolationException: Не удалось выполнить JDBC пакетного обновленияorg.hibernate.exception.ConstraintViolationException: Не удалось выполнить JDBC пакетное обновление [Из-за уникального ограничения]
java.sql .BatchUpdateException: Дублировать запись '24 -0-es_reservation_detail 'для ключа' questionId_referenceId_referenceType '
Я собираюсь сохранить объект резервирования. Этот объект резервирования содержит коллекцию объектов reserveaitonDetails и каждый объект детали резервирования содержит коллекцию questionAnswers Objects.
Основной проблемой является ограничение уникальности на 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 (table) непосредственно перед созданием следующего запроса вставки.
Сценарий 8 должен работать после 4-го сценария
Сценарий 9 должен работать после 5-го сценария
Какой тип генератора вы используете, кажется, что идентификатор не увеличивается, на вопросе и ссылочном объекте –
Как я читал документы спящего режима. Hibernate сначала вставляет дочерние объекты (questionAnswer) с нулевой или 0 ссылкой, а затем hibernate выполняет запрос на обновление (см. Сценарий 8 и 9). –
два разных объекта не могут иметь одинаковый идентификатор, я не знаю, где вы получили точку, является вопросом_ид, а reference_id - составными ключами? –