我有两个表,其中一个表对另一个表的主键有外键约束。 我需要执行一个事务,我需要在两个表中插入一个条目,并且仅当两个条目都成功时才提交事务,否则回滚整个事务,
但是由于第二张表中存在外键约束,并且第一张表中的条目尚未提交,因此无法执行对第二张表的插入。
表结构如下:
订单大师
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| OID | varchar(255) | NO | PRI | NULL | |
| CUSTOMER | varchar(255) | YES | MUL | NULL | |
| DATE | datetime | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
订单详情
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| ID | int(11) | NO | PRI | NULL | |
| OID | varchar(255) | YES | MUL | NULL | |
| ITEM | varchar(255) | YES | MUL | NULL | |
| QUANT | int(11) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
此处 orderDetails 表中的 OID 字段是 orderMaster 表中的外键。
我正在使用 hibernate 将条目保存到表中
try{
transaction.begin();
session.save(orderMaster);
boolean status=false;
OrderDetailsDAO odao= new OrderDetailsDAO();
System.out.println(orderDetails.size());
for(OrderDetails od: orderDetails){
status=odao.saveOrder(od);
if(!status)
break;
}
if(!status){
txn.rollback();
return false;
}
else{
txn.commit();
return true;
}
}catch(HibernateException ex){
ex.printStackTrace();
if(txn!=null)
txn.rollback();
return false;
}
我的堆栈轨迹如下:
java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`cart`.`orderdetails`, CONSTRAINT `FKB8CC1F34C5FC9376` FOREIGN KEY (`OID`) REFERENCES `ordermaster` (`OID`))
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 37 more
我如何插入到两个表中?
如果在两个表上都完成了完整的条目,那么才应该提交事务,否则应该发生回滚。
最佳答案
除非您引入了循环依赖,否则这不会成为问题。在插入与其冲突的行之前,请确保满足外键依赖性。您可以在错误列中插入具有 NULL 值的行,然后在处理外部引用后,将 NULL 值更新为重要的 FK 引用值。
关于java - 在表中插入一行而不提交所需的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38983121/