From 28a6e5ce8ae5e39cb61a831ded2b933458f1020c Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Mon, 18 Mar 2024 14:42:46 +0100 Subject: [PATCH] refactor: Avoid recreation of imperative nested statemachine in some comes. Fixes #2882 --- .../springframework/data/neo4j/core/Neo4jTemplate.java | 4 +++- .../mapping/NestedRelationshipProcessingStateMachine.java | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java b/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java index ee51dd4b3..30b1a8163 100644 --- a/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java +++ b/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java @@ -575,12 +575,14 @@ public final class Neo4jTemplate implements .collect(Collectors.toMap(m -> (Value) m.getKey(), m -> (String) m.getValue())); // Save related + var stateMachine = new NestedRelationshipProcessingStateMachine(neo4jMappingContext, null, null); return entitiesToBeSaved.stream().map(t -> { PersistentPropertyAccessor propertyAccessor = entityMetaData.getPropertyAccessor(t.modifiedInstance); Neo4jPersistentProperty idProperty = entityMetaData.getRequiredIdProperty(); Object id = convertIdValues(idProperty, propertyAccessor.getProperty(idProperty)); String internalId = idToInternalIdMapping.get(id); - return this.processRelations(entityMetaData, propertyAccessor, t.wasNew, new NestedRelationshipProcessingStateMachine(neo4jMappingContext, t.originalInstance, internalId), TemplateSupport.computeIncludePropertyPredicate(pps, entityMetaData)); + stateMachine.registerInitialObject(t.originalInstance, internalId); + return this.processRelations(entityMetaData, propertyAccessor, t.wasNew, stateMachine, TemplateSupport.computeIncludePropertyPredicate(pps, entityMetaData)); }).collect(Collectors.toList()); } diff --git a/src/main/java/org/springframework/data/neo4j/core/mapping/NestedRelationshipProcessingStateMachine.java b/src/main/java/org/springframework/data/neo4j/core/mapping/NestedRelationshipProcessingStateMachine.java index 5d2214318..f8ed7a23d 100644 --- a/src/main/java/org/springframework/data/neo4j/core/mapping/NestedRelationshipProcessingStateMachine.java +++ b/src/main/java/org/springframework/data/neo4j/core/mapping/NestedRelationshipProcessingStateMachine.java @@ -73,9 +73,15 @@ public final class NestedRelationshipProcessingStateMachine { this.mappingContext = mappingContext; } - public NestedRelationshipProcessingStateMachine(final Neo4jMappingContext mappingContext, Object initialObject, Object elementId) { + public NestedRelationshipProcessingStateMachine(final Neo4jMappingContext mappingContext, @Nullable Object initialObject, @Nullable Object elementId) { this(mappingContext); + if (initialObject != null && elementId != null) { + registerInitialObject(initialObject, elementId); + } + } + + public void registerInitialObject(Object initialObject, Object elementId) { Assert.notNull(initialObject, "Initial object must not be null"); Assert.notNull(elementId, "The initial objects element ID must not be null");