如何处理 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?