如何处理 jdbc 事务中的父键约束?

Posted

技术标签:

【中文标题】如何处理 jdbc 事务中的父键约束?【英文标题】:How to handle parent key constraints in jdbc transactions? 【发布时间】:2010-10-02 15:37:41 【问题描述】:

我有 2 个名为 T1 和 T2 的表。其中 T1 是父级,T2 是子级。 场景是,我启动了一个 jdbc 事务,然后在 T1 中插入一行,然后尝试在 T2 中插入一行。在 T2 中插入行会给我“未找到完整性约束 - 父键”异常。

我如何处理这种情况?

 Connection con;
try
  con = ConnectionPool.getConnection();
  con.setAutoCommit(false);
  int T1Id = getNewId("T1"); // from sequence;
  int T2Id = getNewId("T2"); // from sequence;
  Insert in to table T1(t1Id,tName) values (T1Id,'A')
  Insert in to table T2(t2Id, t1Id,tName) values (T2Id,T1Id,'A')//Here, Exception raises

  con.commit();

 catch(Exception e)
    try con.rollback(); catch (SQLException e) 

 finally
     try con.setAutoCommit(true); catch (SQLException e) 
     ConnectionPool.returnConnection(con);

使用JDBC API、struts1.2、Oracle10 G 数据库

【问题讨论】:

您应该显示您的实际 JDBC 代码。不是伪sql代码。 不是真正的 Java 代码。我会投票结束这个。 【参考方案1】:

你可能做错了什么。如果两个插入都在同一个事务中,那么您刚才提到的事情就不会发生。请分享一些代码和更多信息(数据库服务器、表结构),看看我们是否可以帮助您。

【讨论】:

你明白我的问题了吗? 是的,我做到了。而且我告诉你,如果你在同一个事务中进行两次插入,它就不会发生。我们仍然需要更多信息来帮助您。【参考方案2】:

您需要一个三步流程:

    将行插入父项 从父级选择生成的密钥 使用生成的密钥和子信息插入到子中

它应该是一个单一的工作单元,所以让它成为事务性的。

从您的伪代码中无法判断。了解您是否使用自动生成的密钥也很有帮助。

我猜你为 T1 假设的主键实际上并没有出现。如果 T2 说外键不能为 null 或者是必需的,并且它没有出现在 T1 中,那么 RDBMS 系统应该抱怨并抛出异常。

【讨论】:

我正在执行第 1 步和第 3 步。跳过第 2 步,因为我已经有新生成的 id,从序列中获取。所有 3 个步骤都已在事务中。 "我猜测您为 T1 假设的主键实际上并没有出现。如果 T2 说外键不能为空或者是必需的,并且它没有出现在 T1 中,那么RDBMS 系统应该抱怨并抛出异常。”是的,这是场景,T1 的主键不会因为事务而出现。 您需要生成一个可以插入到两者中的密钥,或者在不提交的情况下执行相当于刷新的操作。 T1 是父表,我有 T1 的主键。然后我使用这个键 int T2 的表,其中 T1 的键作为外键。现在,当我执行 T2 的插入 SQL 时,会引发“未找到父键”异常并回滚事务。 那不是 Java 代码。还是伪代码。我会投票结束这个。

以上是关于如何处理 jdbc 事务中的父键约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理具有排除约束的表的更新?

自动布局和编程约束:如何处理多次触发的 updateConstraints?

HikariCP 如何处理不完整的 JDBC 事务?

如何处理 Xcode 故事板中的错位视图警告?

Django:如何处理CreateView中针对UNIQUE约束的错误消息失败

在从 Postgres 9.4 到 Greenplum 的数据迁移过程中,我应该如何处理我的 UNIQUE 约束