instances);
@@ -78,6 +83,11 @@ public interface JdbcAggregateOperations {
/**
* Deletes a single Aggregate including all entities contained in that aggregate.
+ *
+ * Since no version attribute is provided this method will never throw a
+ * {@link org.springframework.dao.OptimisticLockingFailureException}. If no rows match the generated delete operation
+ * this fact will be silently ignored.
+ *
*
* @param id the id of the aggregate root of the aggregate to be deleted. Must not be {@code null}.
* @param domainType the type of the aggregate root.
@@ -87,7 +97,12 @@ public interface JdbcAggregateOperations {
/**
* Deletes all aggregates identified by their aggregate root ids.
- *
+ *
+ * Since no version attribute is provided this method will never throw a
+ * {@link org.springframework.dao.OptimisticLockingFailureException}. If no rows match the generated delete operation
+ * this fact will be silently ignored.
+ *
+ *
* @param ids the ids of the aggregate roots of the aggregates to be deleted. Must not be {@code null}.
* @param domainType the type of the aggregate root.
* @param the type of the aggregate root.
@@ -100,6 +115,9 @@ public interface JdbcAggregateOperations {
* @param aggregateRoot to delete. Must not be {@code null}.
* @param domainType the type of the aggregate root. Must not be {@code null}.
* @param the type of the aggregate root.
+ * @throws org.springframework.dao.OptimisticLockingFailureException when {@literal T} has a version attribute and the
+ * version attribute of the provided entity does not match the version attribute in the database, or when
+ * there is no aggregate root with matching id. In other cases a NOOP delete is silently ignored.
*/
void delete(T aggregateRoot, Class domainType);
@@ -116,6 +134,9 @@ public interface JdbcAggregateOperations {
* @param aggregateRoots to delete. Must not be {@code null}.
* @param domainType type of the aggregate roots to be deleted. Must not be {@code null}.
* @param the type of the aggregate roots.
+ * @throws org.springframework.dao.OptimisticLockingFailureException when {@literal T} has a version attribute and for at least on entity the
+ * version attribute of the entity does not match the version attribute in the database, or when
+ * there is no aggregate root with matching id. In other cases a NOOP delete is silently ignored.
*/
void deleteAll(Iterable extends T> aggregateRoots, Class domainType);
diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java
index f825f5c6be..dd2987aac0 100644
--- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java
+++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java
@@ -866,11 +866,11 @@ void saveAndUpdateAggregateWithImmutableVersion() {
assertThatThrownBy(() -> template.save(new AggregateWithImmutableVersion(id, 0L)))
.describedAs("saving an aggregate with an outdated version should raise an exception")
- .hasRootCauseInstanceOf(OptimisticLockingFailureException.class);
+ .isInstanceOf(OptimisticLockingFailureException.class);
assertThatThrownBy(() -> template.save(new AggregateWithImmutableVersion(id, 2L)))
.describedAs("saving an aggregate with a future version should raise an exception")
- .hasRootCauseInstanceOf(OptimisticLockingFailureException.class);
+ .isInstanceOf(OptimisticLockingFailureException.class);
}
@Test // GH-1137
@@ -915,12 +915,12 @@ void deleteAggregateWithVersion() {
assertThatThrownBy(
() -> template.delete(new AggregateWithImmutableVersion(id, 0L), AggregateWithImmutableVersion.class))
.describedAs("deleting an aggregate with an outdated version should raise an exception")
- .hasRootCauseInstanceOf(OptimisticLockingFailureException.class);
+ .isInstanceOf(OptimisticLockingFailureException.class);
assertThatThrownBy(
() -> template.delete(new AggregateWithImmutableVersion(id, 2L), AggregateWithImmutableVersion.class))
.describedAs("deleting an aggregate with a future version should raise an exception")
- .hasRootCauseInstanceOf(OptimisticLockingFailureException.class);
+ .isInstanceOf(OptimisticLockingFailureException.class);
// This should succeed
template.delete(aggregate, AggregateWithImmutableVersion.class);
@@ -1060,12 +1060,12 @@ private void saveAndUpdateAggregateWithVersion(VersionedAggre
reloadedAggregate.setVersion(toConcreteNumber.apply(initialId));
assertThatThrownBy(() -> template.save(reloadedAggregate))
.withFailMessage("saving an aggregate with an outdated version should raise an exception")
- .hasRootCauseInstanceOf(OptimisticLockingFailureException.class);
+ .isInstanceOf(OptimisticLockingFailureException.class);
reloadedAggregate.setVersion(toConcreteNumber.apply(initialId + 2));
assertThatThrownBy(() -> template.save(reloadedAggregate))
.withFailMessage("saving an aggregate with a future version should raise an exception")
- .hasRootCauseInstanceOf(OptimisticLockingFailureException.class);
+ .isInstanceOf(OptimisticLockingFailureException.class);
}
private Long count(String tableName) {
diff --git a/spring-data-r2dbc/pom.xml b/spring-data-r2dbc/pom.xml
index e263db3097..7db70fd57c 100644
--- a/spring-data-r2dbc/pom.xml
+++ b/spring-data-r2dbc/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-r2dbc
- 3.0.0-SNAPSHOT
+ 3.0.0-1313-noop-deletes-SNAPSHOT
Spring Data R2DBC
Spring Data module for R2DBC
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-relational-parent
- 3.0.0-SNAPSHOT
+ 3.0.0-1313-noop-deletes-SNAPSHOT
diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml
index 717ac86edf..407f43d770 100644
--- a/spring-data-relational/pom.xml
+++ b/spring-data-relational/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-relational
- 3.0.0-SNAPSHOT
+ 3.0.0-1313-noop-deletes-SNAPSHOT
Spring Data Relational
Spring Data Relational support
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-relational-parent
- 3.0.0-SNAPSHOT
+ 3.0.0-1313-noop-deletes-SNAPSHOT