gpt4 book ai didi

java - org.hibernate.exception.ConstraintViolationException : Could not execute JDBC batch update [Due to Unique Constraint]

转载 作者:可可西里 更新时间:2023-11-01 08:29:21 24 4
gpt4 key购买 nike

错误:org.hibernate.exception.ConstraintViolationException: 无法执行 JDBC 批量更新

java.sql.BatchUpdateException:键“questionId_referenceId_referenceType”的重复条目“24-0-es_reservation_detail”

我要保存预订对象。此预订对象包含 reservaitonDetails 对象的集合,每个预订详细信息对象包含 questionAnswers 对象的集合。

主要问题是questionAnswer表的唯一约束

Unqiue Constraint: question_id, reference_id, reference_type.

当系统保存预订对象时:系统首先保存预订,然后收集预订详情,然后将其所有问题答案带0(reference_id)。添加引用 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)脚本。系统将通过约束违反异常。

有什么方法可以在创建下一个插入查询之前立即 hibernate 更新 question_answer(表)中的 reference_id。

脚本 8 必须在第 4 个脚本之后运行

脚本 9 必须在第 5 个脚本之后运行

最佳答案

如果您在子映射中正确映射了父类,则 Hiberate cascade 选项会使用外键插入子对象。如果您没有在子映射中映射父类,而是映射为 Integer reference_id,则将使用单独的更新查询更新外键:

 update question_answer set reference_id = ? where question_answer_id = ?

如果您不能在子映射中指定父类对象,那么您可以使用变通方法。您可以将 reference_id 设置为 null 允许(在表上),并且您需要在子对象中设置 referenceId=null;。然后 Hibernate 级联将插入子对象将 null 外键,然后调用更新查询来设置 referenceId 生成的外键。

注意:唯一列中的 null 值如果出现多次,则不会被视为重复值。

关于java - org.hibernate.exception.ConstraintViolationException : Could not execute JDBC batch update [Due to Unique Constraint],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31179392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com