From fd6e437ded8545fca792d0ea41b108050fe7db82 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 23 Sep 2021 11:03:38 +0200 Subject: [PATCH 1/2] 1053-rename-after-load-to-after-convert - Prepare branch --- pom.xml | 2 +- spring-data-jdbc-distribution/pom.xml | 2 +- spring-data-jdbc/pom.xml | 4 ++-- spring-data-relational/pom.xml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index eeaa0b9e93..a10f5252bc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-1053-rename-after-load-to-after-convert-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index 03d6a5c2a0..d3d84b22bf 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-1053-rename-after-load-to-after-convert-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index af9ad0904e..2bba921ca6 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-jdbc - 2.3.0-SNAPSHOT + 2.3.0-1053-rename-after-load-to-after-convert-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-1053-rename-after-load-to-after-convert-SNAPSHOT diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 4e42a006ec..324b7b27bd 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-relational - 2.3.0-SNAPSHOT + 2.3.0-1053-rename-after-load-to-after-convert-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-1053-rename-after-load-to-after-convert-SNAPSHOT From 734e0afc11fdbc10afa91e7f526e722aab99cec3 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 24 Sep 2021 09:13:11 +0200 Subject: [PATCH 2/2] Introducing AfterConvertCallback/Event. This is to replace the AfterLoadCallback/Event in order to match the naming of other store modules. AfterLoadCallback/Event is still in place for now, but deprecated. Closes #1053 --- .../data/jdbc/core/JdbcAggregateTemplate.java | 20 +++++----- .../support/JdbcQueryLookupStrategy.java | 6 ++- .../core/JdbcAggregateTemplateUnitTests.java | 11 ++++++ .../JdbcRepositoryIntegrationTests.java | 3 +- .../SimpleJdbcRepositoryEventsUnitTests.java | 29 ++++++++------- .../AbstractRelationalEventListener.java | 15 ++++++++ .../mapping/event/AfterConvertCallback.java | 37 +++++++++++++++++++ .../core/mapping/event/AfterConvertEvent.java | 35 ++++++++++++++++++ .../core/mapping/event/AfterLoadCallback.java | 2 + .../core/mapping/event/AfterLoadEvent.java | 2 + ...tractRelationalEventListenerUnitTests.java | 13 +++++++ src/main/asciidoc/jdbc.adoc | 6 +++ 12 files changed, 154 insertions(+), 25 deletions(-) create mode 100644 spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertCallback.java create mode 100644 spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertEvent.java diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java index 02a21b586b..eab91a0d97 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java @@ -208,7 +208,7 @@ public T findById(Object id, Class domainType) { T entity = accessStrategy.findById(id, domainType); if (entity != null) { - return triggerAfterLoad(entity); + return triggerAfterConvert(entity); } return entity; } @@ -236,7 +236,7 @@ public Iterable findAll(Class domainType, Sort sort) { Assert.notNull(domainType, "Domain type must not be null!"); Iterable all = accessStrategy.findAll(domainType, sort); - return triggerAfterLoad(all); + return triggerAfterConvert(all); } /* @@ -248,7 +248,7 @@ public Page findAll(Class domainType, Pageable pageable) { Assert.notNull(domainType, "Domain type must not be null!"); - Iterable items = triggerAfterLoad(accessStrategy.findAll(domainType, pageable)); + Iterable items = triggerAfterConvert(accessStrategy.findAll(domainType, pageable)); List content = StreamSupport.stream(items.spliterator(), false).collect(Collectors.toList()); return PageableExecutionUtils.getPage(content, pageable, () -> accessStrategy.count(domainType)); @@ -264,7 +264,7 @@ public Iterable findAll(Class domainType) { Assert.notNull(domainType, "Domain type must not be null!"); Iterable all = accessStrategy.findAll(domainType); - return triggerAfterLoad(all); + return triggerAfterConvert(all); } /* @@ -278,7 +278,7 @@ public Iterable findAllById(Iterable ids, Class domainType) { Assert.notNull(domainType, "Domain type must not be null!"); Iterable allById = accessStrategy.findAllById(ids, domainType); - return triggerAfterLoad(allById); + return triggerAfterConvert(allById); } /* @@ -385,22 +385,24 @@ private MutableAggregateChange createDeletingChange(Class domainType) { return aggregateChange; } - private Iterable triggerAfterLoad(Iterable all) { + private Iterable triggerAfterConvert(Iterable all) { List result = new ArrayList<>(); for (T e : all) { - result.add(triggerAfterLoad(e)); + result.add(triggerAfterConvert(e)); } return result; } - private T triggerAfterLoad(T entity) { + private T triggerAfterConvert(T entity) { publisher.publishEvent(new AfterLoadEvent<>(entity)); + publisher.publishEvent(new AfterConvertEvent<>(entity)); - return entityCallbacks.callback(AfterLoadCallback.class, entity); + entity = entityCallbacks.callback(AfterLoadCallback.class, entity); + return entityCallbacks.callback(AfterConvertCallback.class, entity); } private T triggerBeforeConvert(T aggregateRoot) { diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryLookupStrategy.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryLookupStrategy.java index e9ee9d36a1..76e23366d3 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryLookupStrategy.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryLookupStrategy.java @@ -32,6 +32,8 @@ import org.springframework.data.relational.core.dialect.Dialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; +import org.springframework.data.relational.core.mapping.event.AfterConvertCallback; +import org.springframework.data.relational.core.mapping.event.AfterConvertEvent; import org.springframework.data.relational.core.mapping.event.AfterLoadCallback; import org.springframework.data.relational.core.mapping.event.AfterLoadEvent; import org.springframework.data.repository.core.NamedQueries; @@ -157,9 +159,11 @@ public T mapRow(ResultSet rs, int rowNum) throws SQLException { if (entity != null) { publisher.publishEvent(new AfterLoadEvent<>(entity)); + publisher.publishEvent(new AfterConvertEvent<>(entity)); if (callbacks != null) { - return callbacks.callback(AfterLoadCallback.class, entity); + entity = callbacks.callback(AfterLoadCallback.class, entity); + return callbacks.callback(AfterConvertCallback.class, entity); } } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java index 9d5dc73177..2362db6243 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java @@ -41,6 +41,7 @@ import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.NamingStrategy; import org.springframework.data.relational.core.mapping.RelationalMappingContext; +import org.springframework.data.relational.core.mapping.event.AfterConvertCallback; import org.springframework.data.relational.core.mapping.event.AfterDeleteCallback; import org.springframework.data.relational.core.mapping.event.AfterLoadCallback; import org.springframework.data.relational.core.mapping.event.AfterSaveCallback; @@ -136,7 +137,9 @@ public void callbackOnLoad() { when(dataAccessStrategy.findAll(SampleEntity.class)).thenReturn(asList(alfred1, neumann1)); when(callbacks.callback(any(Class.class), eq(alfred1), any())).thenReturn(alfred2); + when(callbacks.callback(any(Class.class), eq(alfred2), any())).thenReturn(alfred2); when(callbacks.callback(any(Class.class), eq(neumann1), any())).thenReturn(neumann2); + when(callbacks.callback(any(Class.class), eq(neumann2), any())).thenReturn(neumann2); Iterable all = template.findAll(SampleEntity.class); @@ -158,12 +161,16 @@ public void callbackOnLoadSorted() { when(dataAccessStrategy.findAll(SampleEntity.class, Sort.by("name"))).thenReturn(asList(alfred1, neumann1)); when(callbacks.callback(any(Class.class), eq(alfred1), any())).thenReturn(alfred2); + when(callbacks.callback(any(Class.class), eq(alfred2), any())).thenReturn(alfred2); when(callbacks.callback(any(Class.class), eq(neumann1), any())).thenReturn(neumann2); + when(callbacks.callback(any(Class.class), eq(neumann2), any())).thenReturn(neumann2); Iterable all = template.findAll(SampleEntity.class, Sort.by("name")); verify(callbacks).callback(AfterLoadCallback.class, alfred1); + verify(callbacks).callback(AfterConvertCallback.class, alfred2); verify(callbacks).callback(AfterLoadCallback.class, neumann1); + verify(callbacks).callback(AfterConvertCallback.class, neumann2); assertThat(all).containsExactly(alfred2, neumann2); } @@ -180,12 +187,16 @@ public void callbackOnLoadPaged() { when(dataAccessStrategy.findAll(SampleEntity.class, PageRequest.of(0, 20))).thenReturn(asList(alfred1, neumann1)); when(callbacks.callback(any(Class.class), eq(alfred1), any())).thenReturn(alfred2); + when(callbacks.callback(any(Class.class), eq(alfred2), any())).thenReturn(alfred2); when(callbacks.callback(any(Class.class), eq(neumann1), any())).thenReturn(neumann2); + when(callbacks.callback(any(Class.class), eq(neumann2), any())).thenReturn(neumann2); Iterable all = template.findAll(SampleEntity.class, PageRequest.of(0, 20)); verify(callbacks).callback(AfterLoadCallback.class, alfred1); + verify(callbacks).callback(AfterConvertCallback.class, alfred2); verify(callbacks).callback(AfterLoadCallback.class, neumann1); + verify(callbacks).callback(AfterConvertCallback.class, neumann2); assertThat(all).containsExactly(alfred2, neumann2); } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java index 4d0a1e2f28..99612651bf 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java @@ -59,6 +59,7 @@ import org.springframework.data.jdbc.testing.TestConfiguration; import org.springframework.data.jdbc.testing.TestDatabaseFeatures; import org.springframework.data.relational.core.mapping.event.AbstractRelationalEvent; +import org.springframework.data.relational.core.mapping.event.AfterConvertEvent; import org.springframework.data.relational.core.mapping.event.AfterLoadEvent; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.core.NamedQueries; @@ -309,7 +310,7 @@ public void queryMethodShouldEmitEvents() { repository.findAllWithSql(); - assertThat(eventListener.events).hasSize(1).hasOnlyElementsOfType(AfterLoadEvent.class); + assertThat(eventListener.events).hasSize(2).hasOnlyElementsOfTypes(AfterLoadEvent.class, AfterConvertEvent.class); } @Test // DATAJDBC-318 diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java index 5ab000f816..31d51e8663 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java @@ -51,15 +51,7 @@ import org.springframework.data.relational.core.dialect.H2Dialect; import org.springframework.data.relational.core.dialect.HsqlDbDialect; import org.springframework.data.relational.core.mapping.RelationalMappingContext; -import org.springframework.data.relational.core.mapping.event.AfterDeleteEvent; -import org.springframework.data.relational.core.mapping.event.AfterLoadEvent; -import org.springframework.data.relational.core.mapping.event.AfterSaveEvent; -import org.springframework.data.relational.core.mapping.event.BeforeConvertEvent; -import org.springframework.data.relational.core.mapping.event.BeforeDeleteEvent; -import org.springframework.data.relational.core.mapping.event.BeforeSaveEvent; -import org.springframework.data.relational.core.mapping.event.Identifier; -import org.springframework.data.relational.core.mapping.event.RelationalEvent; -import org.springframework.data.relational.core.mapping.event.WithId; +import org.springframework.data.relational.core.mapping.event.*; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; @@ -198,7 +190,9 @@ public void publishesEventsOnFindAll() { .extracting(e -> (Class) e.getClass()) // .containsExactly( // AfterLoadEvent.class, // - AfterLoadEvent.class // + AfterConvertEvent.class, // + AfterLoadEvent.class, // + AfterConvertEvent.class // ); } @@ -217,7 +211,9 @@ public void publishesEventsOnFindAllById() { .extracting(e -> (Class) e.getClass()) // .containsExactly( // AfterLoadEvent.class, // - AfterLoadEvent.class // + AfterConvertEvent.class, // + AfterLoadEvent.class, // + AfterConvertEvent.class // ); } @@ -234,7 +230,8 @@ public void publishesEventsOnFindById() { assertThat(publisher.events) // .extracting(e -> (Class) e.getClass()) // .containsExactly( // - AfterLoadEvent.class // + AfterLoadEvent.class, // + AfterConvertEvent.class // ); } @@ -253,7 +250,9 @@ public void publishesEventsOnFindAllSorted() { .extracting(e -> (Class) e.getClass()) // .containsExactly( // AfterLoadEvent.class, // - AfterLoadEvent.class // + AfterConvertEvent.class, // + AfterLoadEvent.class, // + AfterConvertEvent.class // ); } @@ -273,7 +272,9 @@ public void publishesEventsOnFindAllPaged() { .extracting(e -> (Class) e.getClass()) // .containsExactly( // AfterLoadEvent.class, // - AfterLoadEvent.class // + AfterConvertEvent.class, // + AfterLoadEvent.class, // + AfterConvertEvent.class // ); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListener.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListener.java index 99be6dc85c..dee5ae0e07 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListener.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListener.java @@ -57,6 +57,8 @@ public void onApplicationEvent(AbstractRelationalEvent event) { if (event instanceof AfterLoadEvent) { onAfterLoad((AfterLoadEvent) event); + } else if (event instanceof AfterConvertEvent) { + onAfterConvert((AfterConvertEvent) event); } else if (event instanceof AfterDeleteEvent) { onAfterDelete((AfterDeleteEvent) event); } else if (event instanceof AfterSaveEvent) { @@ -110,6 +112,7 @@ protected void onAfterSave(AfterSaveEvent event) { * Captures {@link AfterLoadEvent}. * * @param event will never be {@literal null}. + * @deprecated use {@link #onAfterConvert(AfterConvertEvent)} instead. */ protected void onAfterLoad(AfterLoadEvent event) { @@ -118,6 +121,18 @@ protected void onAfterLoad(AfterLoadEvent event) { } } + /** + * Captures {@link AfterConvertEvent}. + * + * @param event will never be {@literal null}. + */ + protected void onAfterConvert(AfterConvertEvent event) { + + if (LOG.isDebugEnabled()) { + LOG.debug("onAfterConvert({})", event.getEntity()); + } + } + /** * Captures {@link AfterDeleteEvent}. * diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertCallback.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertCallback.java new file mode 100644 index 0000000000..f2ca2ec7c9 --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertCallback.java @@ -0,0 +1,37 @@ +/* + * Copyright 2019-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.relational.core.mapping.event; + +import org.springframework.data.mapping.callback.EntityCallback; + +/** + * An {@link EntityCallback} that gets invoked after an aggregate was converted from the database into an entity. + * + * @author Jens Schauder + * @since 2.6 + */ +@FunctionalInterface +public interface AfterConvertCallback extends EntityCallback { + + /** + * Entity callback method invoked after an aggregate root was converted. Can return either the same or a modified + * instance of the domain object. + * + * @param aggregate the converted aggregate. + * @return the converted and possibly modified aggregate. + */ + T onAfterConvert(T aggregate); +} diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertEvent.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertEvent.java new file mode 100644 index 0000000000..c47b003b4e --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterConvertEvent.java @@ -0,0 +1,35 @@ +/* + * Copyright 2017-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.relational.core.mapping.event; + +/** + * Gets published after instantiation and setting of all the properties of an entity. This allows to do some + * postprocessing of entities if the entities are mutable. For immutable entities use {@link AfterConvertCallback}. + * + * @author Jens Schauder + * @since 2.6 + */ +public class AfterConvertEvent extends RelationalEventWithEntity { + + private static final long serialVersionUID = 7343072117054666699L; + + /** + * @param entity the newly instantiated entity. Must not be {@literal null}. + */ + public AfterConvertEvent(E entity) { + super(entity); + } +} diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadCallback.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadCallback.java index 39c8c89824..4f7589e20b 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadCallback.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadCallback.java @@ -23,7 +23,9 @@ * @author Jens Schauder * @author Mark Paluch * @since 1.1 + * @deprecated Use {@link AfterConvertCallback} instead. */ +@Deprecated @FunctionalInterface public interface AfterLoadCallback extends EntityCallback { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadEvent.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadEvent.java index 21048a526e..c1a0346805 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadEvent.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadEvent.java @@ -20,7 +20,9 @@ * postprocessing of entities if the entities are mutable. For immutable entities use {@link AfterLoadCallback}. * * @author Jens Schauder + * @deprecated Use {@link AfterConvertEvent} instead. */ +@Deprecated public class AfterLoadEvent extends RelationalEventWithEntity { private static final long serialVersionUID = 7343072117054666699L; diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListenerUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListenerUnitTests.java index 64b1a27598..3f82924738 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListenerUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListenerUnitTests.java @@ -43,6 +43,14 @@ public void afterLoad() { assertThat(events).containsExactly("afterLoad"); } + @Test // GH-1053 + public void afterConvert() { + + listener.onApplicationEvent(new AfterConvertEvent<>(dummyEntity)); + + assertThat(events).containsExactly("afterConvert"); + } + @Test // DATAJDBC-454 public void beforeConvert() { @@ -122,6 +130,11 @@ protected void onAfterLoad(AfterLoadEvent event) { events.add("afterLoad"); } + @Override + protected void onAfterConvert(AfterConvertEvent event) { + events.add("afterConvert"); + } + @Override protected void onAfterDelete(AfterDeleteEvent event) { events.add("afterDelete"); diff --git a/src/main/asciidoc/jdbc.adoc b/src/main/asciidoc/jdbc.adoc index 8d5590f149..be343568a1 100644 --- a/src/main/asciidoc/jdbc.adoc +++ b/src/main/asciidoc/jdbc.adoc @@ -871,6 +871,9 @@ The following table describes the available events: | After an aggregate root gets saved (that is, inserted or updated). | {javadoc-base}org/springframework/data/relational/core/mapping/event/AfterLoadEvent.html[`AfterLoadEvent`] +| After an aggregate root gets created from a database `ResultSet` and all its properties get set. _Note: This is deprecated. Use `AfterConvert` instead_ + +| {javadoc-base}org/springframework/data/relational/core/mapping/event/AfterConvertEvent.html[`AfterConvertEvent`] | After an aggregate root gets created from a database `ResultSet` and all its properties get set. |=== @@ -903,6 +906,9 @@ This is the correct callback if you want to set an id programmatically. | After an aggregate root gets saved (that is, inserted or updated). | {javadoc-base}org/springframework/data/relational/core/mapping/event/AfterLoadCallback.html[`AfterLoadCallback`] +| After an aggregate root gets created from a database `ResultSet` and all its property get set. _This is deprecated, use `AfterConvertCallback` instead_ + +| {javadoc-base}org/springframework/data/relational/core/mapping/event/AfterConvertCallback.html[`AfterConvertCallback`] | After an aggregate root gets created from a database `ResultSet` and all its property get set. |===