2525import java .util .concurrent .locks .ReentrantReadWriteLock ;
2626
2727import org .apiguardian .api .API ;
28+ import org .springframework .lang .NonNull ;
2829import 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