- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
错误: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/
我是一名优秀的程序员,十分优秀!