我正在处理具有表示层,业务层和DAO层的典型三层应用程序。它是一个Java Web应用程序,它使用Spring MVC,Spring Security和Spring的业务层事务管理。它正在与Oracle 10g数据库通信。
我有一个名为createDepartment的业务层方法。在这个方法中,我对DAO层进行了两次调用,以创建部门并为该部门创建一个位置。每次执行此操作时,我都会在尝试创建位置时获得父键未找到的异常。如果我将createPosition移动到表示层(在事务管理之外),它就可以工作。
我可以在Oracle的SQL Developer中复制它。如果我创建一个部门,在关闭连接并获得新部门之前我无法看到该部门,因此我可以看到为什么无法创建该职位。使这与大多数SQL插入不同的是,应用程序使用Oracle的标签安全功能,并且所有部门都分配了标签。因此,在创建部门时,会创建新标签。
如何在创建部门的连接中显示部门?
答案 0 :(得分:2)
听起来像创建“位置”的DAO调用实际上是在与创建部门的DAO调用不同的连接和/或事务上运行。这与观察结果一致:
确保DAO中只有一个事务边界,并确保创建该位置的调用不会无意中创建新事务或连接。 Spring debyug级别的日志记录对于跟踪此问题非常有用,它对每个连接获取/释放和tx开始/结束边界都非常详细。