gpt4 book ai didi

java - 未找到父键 - Spring 事务管理

转载 作者:行者123 更新时间:2023-11-30 05:15:50 25 4
gpt4 key购买 nike

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

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

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

如何使该部门在用于创建该部门的连接中可见?

最佳答案

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

  • 当在事务中创建部门,然后尝试在不同事务中创建职位时,创建该部门的事务尚未提交,因此会失败。
  • 当部门是在 DAO 事务之外创建时,它会被提交,然后职位就会创建成功。

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

关于java - 未找到父键 - Spring 事务管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com