25
25
import java .util .concurrent .locks .ReentrantReadWriteLock ;
26
26
27
27
import org .apiguardian .api .API ;
28
+ import org .springframework .lang .NonNull ;
28
29
import org .springframework .lang .Nullable ;
29
30
30
31
/**
@@ -164,9 +165,12 @@ public void markValueAsProcessed(Object valueToStore, Long internalId) {
164
165
165
166
try {
166
167
write .lock ();
168
+ Object value = extractRelatedValueFromRelationshipProperties (valueToStore );
167
169
this .processedObjects .add (valueToStore );
170
+ this .processedObjects .add (value );
168
171
if (internalId != null ) {
169
172
this .processedObjectsIds .put (valueToStore , internalId );
173
+ this .processedObjectsIds .put (value , internalId );
170
174
}
171
175
} finally {
172
176
write .unlock ();
@@ -180,7 +184,13 @@ public void markValueAsProcessed(Object valueToStore, Long internalId) {
180
184
* @return processed yes (true) / no (false)
181
185
*/
182
186
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
+ }
184
194
}
185
195
186
196
/**
@@ -209,8 +219,9 @@ public void markValueAsProcessedAs(Object relatedValueToStore, Object bean) {
209
219
public Long getInternalId (Object object ) {
210
220
try {
211
221
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 ));
214
225
} finally {
215
226
read .unlock ();
216
227
}
@@ -234,4 +245,14 @@ private boolean hasProcessedAllOf(@Nullable Collection<?> valuesToStore) {
234
245
return processedObjects .containsAll (valuesToStore );
235
246
}
236
247
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
+ }
237
258
}
0 commit comments