未找到父密钥 - Spring事务管理

时间:2009-09-03 17:00:00

标签: java oracle spring

我正在处理具有表示层,业务层和DAO层的典型三层应用程序。它是一个Java Web应用程序,它使用Spring MVC,Spring Security和Spring的业务层事务管理。它正在与Oracle 10g数据库通信。

我有一个名为createDepartment的业务层方法。在这个方法中,我对DAO层进行了两次调用,以创建部门并为该部门创建一个位置。每次执行此操作时,我都会在尝试创建位置时获得父键未找到的异常。如果我将createPosition移动到表示层(在事务管理之外),它就可以工作。

我可以在Oracle的SQL Developer中复制它。如果我创建一个部门,在关闭连接并获得新部门之前我无法看到该部门,因此我可以看到为什么无法创建该职位。使这与大多数SQL插入不同的是,应用程序使用Oracle的标签安全功能,并且所有部门都分配了标签。因此,在创建部门时,会创建新标签。

如何在创建部门的连接中显示部门?

1 个答案:

答案 0 :(得分:2)

听起来像创建“位置”的DAO调用实际上是在与创建部门的DAO调用不同的连接和/或事务上运行。这与观察结果一致:

  • 在事务中创建部门,然后尝试在不同的事务中创建职位时,创建部门的事务尚未提交,因此失败。
  • 当在DAO事务之外创建部门时,它将被提交,然后创建位置确定。

确保DAO中只有一个事务边界,并确保创建该位置的调用不会无意中创建新事务或连接。 Spring debyug级别的日志记录对于跟踪此问题非常有用,它对每个连接获取/释放和tx开始/结束边界都非常详细。