Skip to content

Commit 454647f

Browse files
committed
GH-2318 - Include entities of relationship properties in id cache.
Closes #2318
1 parent 44bafd7 commit 454647f

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,10 @@ private <T> T processNestedRelations(Neo4jPersistentEntity<?> sourceEntity, Pers
750750
savedEntity = saveRelatedNode(newRelatedObject, targetEntity, includeProperty, currentPropertyPath);
751751
relatedInternalId = savedEntity.id();
752752
stateMachine.markValueAsProcessed(relatedValueToStore, relatedInternalId);
753+
if (relatedValueToStore instanceof MappingSupport.RelationshipPropertiesWithEntityHolder) {
754+
Object entity = ((MappingSupport.RelationshipPropertiesWithEntityHolder) relatedValueToStore).getRelatedEntity();
755+
stateMachine.markValueAsProcessedAs(entity, relatedInternalId);
756+
}
753757
}
754758

755759
PersistentPropertyAccessor<?> targetPropertyAccessor = targetEntity.getPropertyAccessor(newRelatedObject);

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,13 @@ private <T> Mono<T> processNestedRelations(Neo4jPersistentEntity<?> sourceEntity
848848
.map(id -> Tuples.of(id, new Long[1]));
849849
} else {
850850
queryOrSave = saveRelatedNode(newRelatedObject, targetEntity, includeProperty, currentPropertyPath)
851-
.doOnNext(entity -> stateMachine.markValueAsProcessed(relatedValueToStore, entity.id()))
851+
.doOnNext(entity -> {
852+
stateMachine.markValueAsProcessed(relatedValueToStore, entity.id());
853+
if (relatedValueToStore instanceof MappingSupport.RelationshipPropertiesWithEntityHolder) {
854+
Object value = ((MappingSupport.RelationshipPropertiesWithEntityHolder) relatedValueToStore).getRelatedEntity();
855+
stateMachine.markValueAsProcessedAs(value, entity.id());
856+
}
857+
})
852858
.map(entity -> {
853859
Long version = targetEntity.hasVersionProperty() ?
854860
entity.get(targetEntity.getVersionProperty().getPropertyName()).asLong() :

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.concurrent.locks.ReentrantReadWriteLock;
2626

2727
import org.apiguardian.api.API;
28+
import org.springframework.lang.NonNull;
2829
import org.springframework.lang.Nullable;
2930

3031
/**
@@ -164,9 +165,12 @@ public void markValueAsProcessed(Object valueToStore, Long internalId) {
164165

165166
try {
166167
write.lock();
168+
Object value = extractRelatedValueFromRelationshipProperties(valueToStore);
167169
this.processedObjects.add(valueToStore);
170+
this.processedObjects.add(value);
168171
if (internalId != null) {
169172
this.processedObjectsIds.put(valueToStore, internalId);
173+
this.processedObjectsIds.put(value, internalId);
170174
}
171175
} finally {
172176
write.unlock();
@@ -180,7 +184,13 @@ public void markValueAsProcessed(Object valueToStore, Long internalId) {
180184
* @return processed yes (true) / no (false)
181185
*/
182186
public boolean hasProcessedValue(Object value) {
183-
return processedObjects.contains(value) || processedObjectsAlias.containsKey(value);
187+
try {
188+
read.lock();
189+
Object valueToCheck = extractRelatedValueFromRelationshipProperties(value);
190+
return processedObjects.contains(valueToCheck) || processedObjectsAlias.containsKey(valueToCheck);
191+
} finally {
192+
read.unlock();
193+
}
184194
}
185195

186196
/**
@@ -209,8 +219,9 @@ public void markValueAsProcessedAs(Object relatedValueToStore, Object bean) {
209219
public Long getInternalId(Object object) {
210220
try {
211221
read.lock();
212-
Long possibleId = processedObjectsIds.get(object);
213-
return possibleId != null ? possibleId : processedObjectsIds.get(processedObjectsAlias.get(object));
222+
Object valueToCheck = extractRelatedValueFromRelationshipProperties(object);
223+
Long possibleId = processedObjectsIds.get(valueToCheck);
224+
return possibleId != null ? possibleId : processedObjectsIds.get(processedObjectsAlias.get(valueToCheck));
214225
} finally {
215226
read.unlock();
216227
}
@@ -234,4 +245,14 @@ private boolean hasProcessedAllOf(@Nullable Collection<?> valuesToStore) {
234245
return processedObjects.containsAll(valuesToStore);
235246
}
236247

248+
@NonNull
249+
private Object extractRelatedValueFromRelationshipProperties(Object valueToStore) {
250+
Object value;
251+
if (valueToStore instanceof MappingSupport.RelationshipPropertiesWithEntityHolder) {
252+
value = ((MappingSupport.RelationshipPropertiesWithEntityHolder) valueToStore).getRelatedEntity();
253+
} else {
254+
value = valueToStore;
255+
}
256+
return value;
257+
}
237258
}

0 commit comments

Comments
 (0)