spring-data-jdbc - 为什么我得到 DbActionExecutionException 而不是 DuplicateKeyException
spring-data-jdbc - Why do I get DbActionExecutionException instead of DuplicateKeyException
使用:
- spring-boot 2.3.6.RELEASE
- spring-数据-jdbc.
- postgresql
我做了一个简单的存储库,扩展了 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。
在 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。
使用:
- spring-boot 2.3.6.RELEASE
- spring-数据-jdbc.
- postgresql
我做了一个简单的存储库,扩展了 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。
在 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。