Skip to content

Commit 6cfd4f2

Browse files
committed
GH-2223 - Reactive part.
1 parent c7da5f6 commit 6cfd4f2

File tree

3 files changed

+44
-3
lines changed

3 files changed

+44
-3
lines changed

src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -544,8 +544,8 @@ private <T> T processNestedRelations(Neo4jPersistentEntity<?> sourceEntity, Pers
544544
Long relatedInternalId;
545545
// No need to save values if processed
546546
if (stateMachine.hasProcessedValue(relatedValueToStore)) {
547-
Object thing = stateMachine.getProcessedAs(newRelatedObject);
548-
relatedInternalId = queryRelatedNode(thing, targetEntity, inDatabase);
547+
Object newRelatedObjectForQuery = stateMachine.getProcessedAs(newRelatedObject);
548+
relatedInternalId = queryRelatedNode(newRelatedObjectForQuery, targetEntity, inDatabase);
549549
} else {
550550
relatedInternalId = saveRelatedNode(newRelatedObject, targetEntity, inDatabase);
551551
}

src/main/java/org/springframework/data/neo4j/core/ReactiveNeo4jTemplate.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,8 @@ private <T> Mono<T> processNestedRelations(Neo4jPersistentEntity<?> sourceEntity
661661

662662
Mono<Long> queryOrSave;
663663
if (stateMachine.hasProcessedValue(relatedValueToStore)) {
664-
queryOrSave = queryRelatedNode(newRelatedObject, targetEntity, inDatabase);
664+
Object newRelatedObjectForQuery = stateMachine.getProcessedAs(newRelatedObject);
665+
queryOrSave = queryRelatedNode(newRelatedObjectForQuery, targetEntity, inDatabase);
665666
} else {
666667
queryOrSave = saveRelatedNode(newRelatedObject, targetEntity, inDatabase);
667668
}
@@ -671,6 +672,7 @@ private <T> Mono<T> processNestedRelations(Neo4jPersistentEntity<?> sourceEntity
671672
PersistentPropertyAccessor<?> targetPropertyAccessor = targetEntity.getPropertyAccessor(newRelatedObject);
672673
if (targetEntity.isUsingInternalIds()) {
673674
targetPropertyAccessor.setProperty(targetEntity.getRequiredIdProperty(), relatedInternalId);
675+
stateMachine.markValueAsProcessedAs(newRelatedObject, targetPropertyAccessor.getBean());
674676
}
675677

676678
Object idValue = idProperty != null

src/test/java/org/springframework/data/neo4j/integration/reactive/ReactiveImmutableGeneratedIdsIT.java

+39
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
1919

20+
import org.neo4j.driver.Record;
21+
import org.neo4j.driver.Session;
22+
import org.springframework.data.neo4j.repository.Neo4jRepository;
2023
import reactor.test.StepVerifier;
2124

25+
import java.util.ArrayList;
2226
import java.util.Arrays;
2327
import java.util.Collections;
2428
import java.util.List;
@@ -302,6 +306,41 @@ void childrenShouldNotBeRecreatedForNoReasons(@Autowired ReactiveNeo4jTemplate t
302306
.verifyComplete();
303307
}
304308

309+
@Test // GH-2223
310+
void saveWithGeneratedIdsWithMultipleRelationshipsToOneNode(@Autowired Driver driver,
311+
@Autowired ImmutablePersonWithGeneratedIdRepository repository) {
312+
313+
ImmutablePersonWithGeneratedId person1 = new ImmutablePersonWithGeneratedId();
314+
ImmutablePersonWithGeneratedId person2 = ImmutablePersonWithGeneratedId.fallback(person1);
315+
List<ImmutablePersonWithGeneratedId> onboardedBy = new ArrayList<>();
316+
onboardedBy.add(person1);
317+
onboardedBy.add(person2);
318+
ImmutablePersonWithGeneratedId person3 = ImmutablePersonWithGeneratedId.wasOnboardedBy(onboardedBy);
319+
320+
StepVerifier.create(repository.save(person3))
321+
.assertNext(savedPerson -> {
322+
assertThat(savedPerson.id).isNotNull();
323+
assertThat(savedPerson.wasOnboardedBy).allMatch(ob -> ob.id != null);
324+
325+
ImmutablePersonWithGeneratedId savedPerson2 = savedPerson.wasOnboardedBy.stream().filter(p -> p.fallback != null).findFirst().get();
326+
assertThat(savedPerson2.fallback.id).isNotNull();
327+
})
328+
.verifyComplete();
329+
330+
try (Session session = driver.session()) {
331+
List<Record> result = session.run(
332+
"MATCH (person3:ImmutablePersonWithGeneratedId) " +
333+
"-[:ONBOARDED_BY]->(person2:ImmutablePersonWithGeneratedId) " +
334+
"-[:FALLBACK]->(person1:ImmutablePersonWithGeneratedId), " +
335+
"(person3)-[:ONBOARDED_BY]->(person1) " +
336+
"return person3")
337+
.list();
338+
assertThat(result).hasSize(1);
339+
}
340+
}
341+
342+
interface ImmutablePersonWithGeneratedIdRepository extends ReactiveNeo4jRepository<ImmutablePersonWithGeneratedId, Long> {}
343+
305344
@Configuration
306345
@EnableReactiveNeo4jRepositories(considerNestedRepositories = true)
307346
@EnableTransactionManagement

0 commit comments

Comments
 (0)