Skip to content

Commit 9c041c2

Browse files
committed
GH-2225 - Naive imperative solution.
1 parent 38f44b3 commit 9c041c2

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,8 @@ private <T> T processNestedRelations(Neo4jPersistentEntity<?> sourceEntity, Obje
524524
Long relatedInternalId;
525525
// No need to save values if processed
526526
if (stateMachine.hasProcessedValue(relatedValueToStore)) {
527-
relatedInternalId = queryRelatedNode(relatedNode, targetEntity, inDatabase);
527+
Object thing = stateMachine.getProcessedAs(relatedNode);
528+
relatedInternalId = queryRelatedNode(thing, targetEntity, inDatabase);
528529
} else {
529530
relatedInternalId = saveRelatedNode(relatedNode, targetEntity, inDatabase);
530531
}
@@ -560,6 +561,7 @@ private <T> T processNestedRelations(Neo4jPersistentEntity<?> sourceEntity, Obje
560561
// if an internal id is used this must get set to link this entity in the next iteration
561562
if (targetEntity.isUsingInternalIds()) {
562563
targetPropertyAccessor.setProperty(targetEntity.getRequiredIdProperty(), relatedInternalId);
564+
stateMachine.markValueAsProcessedAs(relatedNode, targetPropertyAccessor.getBean());
563565
}
564566
if (processState != ProcessState.PROCESSED_ALL_VALUES) {
565567
processNestedRelations(targetEntity, targetPropertyAccessor.getBean(), isEntityNew, inDatabase, stateMachine);

src/main/java/org/springframework/data/neo4j/core/mapping/NestedRelationshipProcessingStateMachine.java

+21
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
package org.springframework.data.neo4j.core.mapping;
1717

1818
import java.util.Collection;
19+
import java.util.HashMap;
1920
import java.util.HashSet;
21+
import java.util.Map;
2022
import java.util.Objects;
2123
import java.util.Set;
2224
import java.util.concurrent.locks.Lock;
@@ -35,6 +37,24 @@
3537
@API(status = API.Status.INTERNAL, since = "6.0")
3638
public final class NestedRelationshipProcessingStateMachine {
3739

40+
public void markValueAsProcessedAs(Object relatedValueToStore, Object bean) {
41+
try {
42+
write.lock();
43+
processedObjectsAlias.put(relatedValueToStore, bean);
44+
} finally {
45+
write.unlock();
46+
}
47+
}
48+
49+
public Object getProcessedAs(Object entity) {
50+
try {
51+
read.lock();
52+
return processedObjectsAlias.getOrDefault(entity, entity);
53+
} finally {
54+
read.unlock();
55+
}
56+
}
57+
3858
/**
3959
* Valid processing states.
4060
*/
@@ -55,6 +75,7 @@ public enum ProcessState {
5575
* The set of already processed related objects.
5676
*/
5777
private final Set<Object> processedObjects = new HashSet<>();
78+
private final Map<Object, Object> processedObjectsAlias = new HashMap<>();
5879

5980
public NestedRelationshipProcessingStateMachine(Object initialObject) {
6081
processedObjects.add(initialObject);

0 commit comments

Comments
 (0)