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

标签 java oracle spring

我正在使用典型的三层应用程序,该应用程序具有表示层、业务层和 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/

相关文章:

java - 如何在java中增加id并获取冗长的描述

mysql - 当我们使用嵌套查询 for max(cgpa) 时,我们可以使用 select * 吗

sql - ORA-01843 : not a valid month : TO_DATE ('12-JUN-02' ,'DD-MON-YY' )

oracle - 如何在 Oracle 数据库中将列的数据类型从 varchar2 更改为数字

hibernate - 强制 Spring/JPA/Hibernate/JDBC 重试失败的 beginTransaction?

java - 访问 Spring Filter/HandlerInterceptor 多部分和参数(表单字段)

java - 将属性传递给 Spring 上下文

java - Android或iPhone开发有必要学习J2ME吗?

java - 使用java api的Elasticsearch多条件查询

java - 我怎样才能找到数组中三个最低整数的位置?