spring-data-jdbc - 为什么我得到 DbActionExecutionException 而不是 DuplicateKeyException

spring-data-jdbc - Why do I get DbActionExecutionException instead of DuplicateKeyException

使用:

我做了一个简单的存储库,扩展了 CrudRepository,它运行良好。例如,我可以使用此存储库保存数据。

我在其中一个列上创建了一个唯一索引,并希望我的存储库在尝试两次插入同一对象时抛出 org.springframework.dao.DuplicateKeyException。

然而,repo 反而抛出一个 org.springframework.data.relational.core.conversion.DbActionExecutionException,它有一个 DuplicateKeyException 是它的原因。

我的配置非常基础:仅配置数据源 (spring.datasource.*)

这是 spring-data-jdbc 将 DuplicateKeyException 包装在 DbActionExecutionException 中的正常行为吗?
我过去使用过 spring-data,不记得处理过 DbActionExecutionException。

这是数据库操作的包装器 class。

检查此 link (https://docs.spring.io/spring-data/jdbc/docs/1.0.0.M2/api/org/springframework/data/jdbc/core/conversion/DbActionExecutionException.html)。

在 Spring-Data-Jdbc 中,这是预期的行为。当您使用 CrudRepository 执行任何 DBAction 时,Spring-Data-Jdbc 使用 JdbcTemplate。

如果 JdbcTemplate.

抛出任何异常,CrudRepository 执行的所有 DbAction 将被转换为 DbActionExecutionException

来自 AggregateChangeExecutor 的代码段 class:

private void execute(DbAction<?> action, JdbcAggregateChangeExecutionContext executionContext) {

        try {
            if (action instanceof DbAction.InsertRoot) {
                executionContext.executeInsertRoot((DbAction.InsertRoot<?>) action);
            } else if (action instanceof DbAction.Insert) {
                executionContext.executeInsert((DbAction.Insert<?>) action);
            } else if (action instanceof DbAction.UpdateRoot) {
                executionContext.executeUpdateRoot((DbAction.UpdateRoot<?>) action);
            } else if (action instanceof DbAction.Update) {
                executionContext.executeUpdate((DbAction.Update<?>) action);
            } else if (action instanceof DbAction.Delete) {
                executionContext.executeDelete((DbAction.Delete<?>) action);
            } else if (action instanceof DbAction.DeleteAll) {
                executionContext.executeDeleteAll((DbAction.DeleteAll<?>) action);
            } else if (action instanceof DbAction.DeleteRoot) {
                executionContext.executeDeleteRoot((DbAction.DeleteRoot<?>) action);
            } else if (action instanceof DbAction.DeleteAllRoot) {
                executionContext.executeDeleteAllRoot((DbAction.DeleteAllRoot<?>) action);
            } else if (action instanceof DbAction.AcquireLockRoot) {
                executionContext.executeAcquireLock((DbAction.AcquireLockRoot<?>) action);
            } else if (action instanceof DbAction.AcquireLockAllRoot) {
                executionContext.executeAcquireLockAllRoot((DbAction.AcquireLockAllRoot<?>) action);
            } else {
                throw new RuntimeException("unexpected action");
            }
        } catch (Exception e) {
            throw new DbActionExecutionException(action, e);
        }
    }

JdbcTemplate 在 DBAction 上执行时抛出 DataAccessException,所有 Spring 事务相关异常 classes 实现 DataAccessException。