java - 在表中插入一行而不提交所需的外键

标签 java mysql database hibernate

我有两个表,其中一个表对另一个表的主键有外键约束。 我需要执行一个事务,我需要在两个表中插入一个条目,并且仅当两个条目都成功时才提交事务,否则回滚整个事务,

但是由于第二张表中存在外键约束,并且第一张表中的条目尚未提交,因此无法执行对第二张表的插入。

表结构如下:

订单大师

+----------+--------------+------+-----+---------+-------+
| 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/

相关文章:

database - 如何在数据库中实现父类(super class)、子类关系?

java - 如何使用 IText5 或 IText7 将 AcroForm 字段从一个文档复制/移动到新的空白文档?

java - 刷新 JTable 的最佳方式?

php - 很难从两个表中获取数据

c++ - 如何使用odbc通过c++将excel文件导入到mysql表中?

database - Firebase 数据库中的 "Error loading documents"

JAVA:计算二维光束武器的推力

java - 为什么无法从 WEB-INF 文件夹中加载 POSModel 文件?

Mysql查询获取相差5分钟的行

php - 披萨数据库优化