Skip to content

Commit 4353dc8

Browse files
committed
Improve and clarify documentation of callbacks.
This also removes deprecated Events and Callbacks. Closes #1236
1 parent f6e7792 commit 4353dc8

File tree

16 files changed

+128
-180
lines changed

16 files changed

+128
-180
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,7 @@ private <T> Iterable<T> triggerAfterConvert(Iterable<T> all) {
402402

403403
private <T> T triggerAfterConvert(T entity) {
404404

405-
publisher.publishEvent(new AfterLoadEvent<>(entity));
406405
publisher.publishEvent(new AfterConvertEvent<>(entity));
407-
408-
entity = entityCallbacks.callback(AfterLoadCallback.class, entity);
409406
return entityCallbacks.callback(AfterConvertCallback.class, entity);
410407
}
411408

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryLookupStrategy.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
3737
import org.springframework.data.relational.core.mapping.event.AfterConvertCallback;
3838
import org.springframework.data.relational.core.mapping.event.AfterConvertEvent;
39-
import org.springframework.data.relational.core.mapping.event.AfterLoadCallback;
40-
import org.springframework.data.relational.core.mapping.event.AfterLoadEvent;
4139
import org.springframework.data.repository.core.NamedQueries;
4240
import org.springframework.data.repository.core.RepositoryMetadata;
4341
import org.springframework.data.repository.query.QueryLookupStrategy;
@@ -328,11 +326,9 @@ public T mapRow(ResultSet rs, int rowNum) throws SQLException {
328326

329327
if (entity != null) {
330328

331-
publisher.publishEvent(new AfterLoadEvent<>(entity));
332329
publisher.publishEvent(new AfterConvertEvent<>(entity));
333330

334331
if (callbacks != null) {
335-
entity = callbacks.callback(AfterLoadCallback.class, entity);
336332
return callbacks.callback(AfterConvertCallback.class, entity);
337333
}
338334
}

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateUnitTests.java

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
4747
import org.springframework.data.relational.core.mapping.event.AfterConvertCallback;
4848
import org.springframework.data.relational.core.mapping.event.AfterDeleteCallback;
49-
import org.springframework.data.relational.core.mapping.event.AfterLoadCallback;
5049
import org.springframework.data.relational.core.mapping.event.AfterSaveCallback;
5150
import org.springframework.data.relational.core.mapping.event.BeforeConvertCallback;
5251
import org.springframework.data.relational.core.mapping.event.BeforeDeleteCallback;
@@ -254,30 +253,6 @@ public void callbackOnDelete() {
254253
verify(callbacks).callback(AfterDeleteCallback.class, second);
255254
}
256255

257-
@Test // DATAJDBC-393
258-
public void callbackOnLoad() {
259-
260-
SampleEntity alfred1 = new SampleEntity(23L, "Alfred");
261-
SampleEntity alfred2 = new SampleEntity(23L, "Alfred E.");
262-
263-
SampleEntity neumann1 = new SampleEntity(42L, "Neumann");
264-
SampleEntity neumann2 = new SampleEntity(42L, "Alfred E. Neumann");
265-
266-
when(dataAccessStrategy.findAll(SampleEntity.class)).thenReturn(asList(alfred1, neumann1));
267-
268-
when(callbacks.callback(any(Class.class), eq(alfred1), any())).thenReturn(alfred2);
269-
when(callbacks.callback(any(Class.class), eq(alfred2), any())).thenReturn(alfred2);
270-
when(callbacks.callback(any(Class.class), eq(neumann1), any())).thenReturn(neumann2);
271-
when(callbacks.callback(any(Class.class), eq(neumann2), any())).thenReturn(neumann2);
272-
273-
Iterable<SampleEntity> all = template.findAll(SampleEntity.class);
274-
275-
verify(callbacks).callback(AfterLoadCallback.class, alfred1);
276-
verify(callbacks).callback(AfterLoadCallback.class, neumann1);
277-
278-
assertThat(all).containsExactly(alfred2, neumann2);
279-
}
280-
281256
@Test // DATAJDBC-101
282257
public void callbackOnLoadSorted() {
283258

@@ -290,16 +265,12 @@ public void callbackOnLoadSorted() {
290265
when(dataAccessStrategy.findAll(SampleEntity.class, Sort.by("name"))).thenReturn(asList(alfred1, neumann1));
291266

292267
when(callbacks.callback(any(Class.class), eq(alfred1), any())).thenReturn(alfred2);
293-
when(callbacks.callback(any(Class.class), eq(alfred2), any())).thenReturn(alfred2);
294268
when(callbacks.callback(any(Class.class), eq(neumann1), any())).thenReturn(neumann2);
295-
when(callbacks.callback(any(Class.class), eq(neumann2), any())).thenReturn(neumann2);
296269

297270
Iterable<SampleEntity> all = template.findAll(SampleEntity.class, Sort.by("name"));
298271

299-
verify(callbacks).callback(AfterLoadCallback.class, alfred1);
300-
verify(callbacks).callback(AfterConvertCallback.class, alfred2);
301-
verify(callbacks).callback(AfterLoadCallback.class, neumann1);
302-
verify(callbacks).callback(AfterConvertCallback.class, neumann2);
272+
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
273+
verify(callbacks).callback(AfterConvertCallback.class, neumann1);
303274

304275
assertThat(all).containsExactly(alfred2, neumann2);
305276
}
@@ -316,16 +287,12 @@ public void callbackOnLoadPaged() {
316287
when(dataAccessStrategy.findAll(SampleEntity.class, PageRequest.of(0, 20))).thenReturn(asList(alfred1, neumann1));
317288

318289
when(callbacks.callback(any(Class.class), eq(alfred1), any())).thenReturn(alfred2);
319-
when(callbacks.callback(any(Class.class), eq(alfred2), any())).thenReturn(alfred2);
320290
when(callbacks.callback(any(Class.class), eq(neumann1), any())).thenReturn(neumann2);
321-
when(callbacks.callback(any(Class.class), eq(neumann2), any())).thenReturn(neumann2);
322291

323292
Iterable<SampleEntity> all = template.findAll(SampleEntity.class, PageRequest.of(0, 20));
324293

325-
verify(callbacks).callback(AfterLoadCallback.class, alfred1);
326-
verify(callbacks).callback(AfterConvertCallback.class, alfred2);
327-
verify(callbacks).callback(AfterLoadCallback.class, neumann1);
328-
verify(callbacks).callback(AfterConvertCallback.class, neumann2);
294+
verify(callbacks).callback(AfterConvertCallback.class, alfred1);
295+
verify(callbacks).callback(AfterConvertCallback.class, neumann1);
329296

330297
assertThat(all).containsExactly(alfred2, neumann2);
331298
}

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import org.springframework.data.domain.Pageable;
5151
import org.springframework.data.domain.Slice;
5252
import org.springframework.data.jdbc.core.mapping.AggregateReference;
53-
import org.springframework.data.relational.repository.Lock;
5453
import org.springframework.data.jdbc.repository.query.Modifying;
5554
import org.springframework.data.jdbc.repository.query.Query;
5655
import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactory;
@@ -60,8 +59,8 @@
6059
import org.springframework.data.jdbc.testing.TestDatabaseFeatures;
6160
import org.springframework.data.relational.core.mapping.event.AbstractRelationalEvent;
6261
import org.springframework.data.relational.core.mapping.event.AfterConvertEvent;
63-
import org.springframework.data.relational.core.mapping.event.AfterLoadEvent;
6462
import org.springframework.data.relational.core.sql.LockMode;
63+
import org.springframework.data.relational.repository.Lock;
6564
import org.springframework.data.repository.CrudRepository;
6665
import org.springframework.data.repository.core.NamedQueries;
6766
import org.springframework.data.repository.core.support.PropertiesBasedNamedQueries;
@@ -312,7 +311,7 @@ public void queryMethodShouldEmitEvents() {
312311

313312
repository.findAllWithSql();
314313

315-
assertThat(eventListener.events).hasSize(2).hasOnlyElementsOfTypes(AfterLoadEvent.class, AfterConvertEvent.class);
314+
assertThat(eventListener.events).hasSize(1).hasOnlyElementsOfType(AfterConvertEvent.class);
316315
}
317316

318317
@Test // DATAJDBC-318

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,7 @@ public void publishesEventsOnFindAll() {
190190
assertThat(publisher.events) //
191191
.extracting(e -> (Class) e.getClass()) //
192192
.containsExactly( //
193-
AfterLoadEvent.class, //
194193
AfterConvertEvent.class, //
195-
AfterLoadEvent.class, //
196194
AfterConvertEvent.class //
197195
);
198196
}
@@ -211,9 +209,7 @@ public void publishesEventsOnFindAllById() {
211209
assertThat(publisher.events) //
212210
.extracting(e -> (Class) e.getClass()) //
213211
.containsExactly( //
214-
AfterLoadEvent.class, //
215212
AfterConvertEvent.class, //
216-
AfterLoadEvent.class, //
217213
AfterConvertEvent.class //
218214
);
219215
}
@@ -231,7 +227,6 @@ public void publishesEventsOnFindById() {
231227
assertThat(publisher.events) //
232228
.extracting(e -> (Class) e.getClass()) //
233229
.containsExactly( //
234-
AfterLoadEvent.class, //
235230
AfterConvertEvent.class //
236231
);
237232
}
@@ -250,9 +245,7 @@ public void publishesEventsOnFindAllSorted() {
250245
assertThat(publisher.events) //
251246
.extracting(e -> (Class) e.getClass()) //
252247
.containsExactly( //
253-
AfterLoadEvent.class, //
254248
AfterConvertEvent.class, //
255-
AfterLoadEvent.class, //
256249
AfterConvertEvent.class //
257250
);
258251
}
@@ -272,9 +265,7 @@ public void publishesEventsOnFindAllPaged() {
272265
assertThat(publisher.events) //
273266
.extracting(e -> (Class) e.getClass()) //
274267
.containsExactly( //
275-
AfterLoadEvent.class, //
276268
AfterConvertEvent.class, //
277-
AfterLoadEvent.class, //
278269
AfterConvertEvent.class //
279270
);
280271
}

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AbstractRelationalEventListener.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ public void onApplicationEvent(AbstractRelationalEvent<?> event) {
5151
return;
5252
}
5353

54-
if (event instanceof AfterLoadEvent) {
55-
onAfterLoad((AfterLoadEvent<E>) event);
56-
} else if (event instanceof AfterConvertEvent) {
54+
if (event instanceof AfterConvertEvent) {
5755
onAfterConvert((AfterConvertEvent<E>) event);
5856
} else if (event instanceof AfterDeleteEvent) {
5957
onAfterDelete((AfterDeleteEvent<E>) event);
@@ -104,20 +102,6 @@ protected void onAfterSave(AfterSaveEvent<E> event) {
104102
}
105103
}
106104

107-
/**
108-
* Captures {@link AfterLoadEvent}.
109-
*
110-
* @param event will never be {@literal null}.
111-
* @deprecated use {@link #onAfterConvert(AfterConvertEvent)} instead.
112-
*/
113-
@Deprecated
114-
protected void onAfterLoad(AfterLoadEvent<E> event) {
115-
116-
if (LOG.isDebugEnabled()) {
117-
LOG.debug(String.format("onAfterLoad(%s)", event.getEntity()));
118-
}
119-
}
120-
121105
/**
122106
* Captures {@link AfterConvertEvent}.
123107
*

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadCallback.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterLoadEvent.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterSaveCallback.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,22 @@
1818
import org.springframework.data.mapping.callback.EntityCallback;
1919

2020
/**
21-
* An {@link EntityCallback} that gets invoked after an aggregate was saved.
21+
* An {@link EntityCallback} that gets invoked after an aggregate was saved to the database.
22+
* <p>
23+
* The persisting process works as follows:
24+
* <ol>
25+
* <li>A decision is made, if the aggregate is new and therefore should be inserted or if it is not new and therefore
26+
* should be updated.</li>
27+
* <li>{@link BeforeConvertCallback} and {@link BeforeConvertEvent} get published.</li>
28+
* <li>An {@link org.springframework.data.relational.core.conversion.AggregateChange} object is created for the
29+
* aggregate. It includes the {@link org.springframework.data.relational.core.conversion.DbAction} instances to be
30+
* executed. This means that all the deletes, updates and inserts to be performed are determined. These actions
31+
* reference entities of the aggregates in order to access values to be used in the SQL statements. This step also
32+
* determines if the id of an entity gets passed to the database or if the database is expected to generate that id.</li>
33+
* <li>{@link BeforeSaveCallback} and {@link BeforeSaveEvent} get published.</li>
34+
* <li>SQL statements get applied to the database.</li>
35+
* <li>{@link AfterSaveCallback} and {@link AfterSaveEvent} get published.</li>
36+
* </ol>
2237
*
2338
* @author Jens Schauder
2439
* @author Mark Paluch

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/AfterSaveEvent.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@
1919

2020
/**
2121
* Gets published after a new instance or a changed instance was saved in the database.
22+
* <p>
23+
* The persisting process works as follows:
24+
* <ol>
25+
* <li>A decision is made, if the aggregate is new and therefore should be inserted or if it is not new and therefore
26+
* should be updated.</li>
27+
* <li>{@link BeforeConvertCallback} and {@link BeforeConvertEvent} get published.</li>
28+
* <li>An {@link org.springframework.data.relational.core.conversion.AggregateChange} object is created for the
29+
* aggregate. It includes the {@link org.springframework.data.relational.core.conversion.DbAction} instances to be
30+
* executed. This means that all the deletes, updates and inserts to be performed are determined. These actions
31+
* reference entities of the aggregates in order to access values to be used in the SQL statements. This step also
32+
* determines if the id of an entity gets passed to the database or if the database is expected to generate that id.</li>
33+
* <li>{@link BeforeSaveCallback} and {@link BeforeSaveEvent} get published.</li>
34+
* <li>SQL statements get applied to the database.</li>
35+
* <li>{@link AfterSaveCallback} and {@link AfterSaveEvent} get published.</li>
36+
* </ol>
2237
*
2338
* @author Jens Schauder
2439
*/

0 commit comments

Comments
 (0)