final Object[] naturalIdValues = extractNaturalIdValues( state, descriptor ); final Object[] previousNaturalIdValues = previousState == null ? null : extractNaturalIdValues( previousState, descriptor ); managedSharedCacheEntries( descriptor, cacheAccess,
@Override public void handleEviction(Object object, EntityTypeDescriptor descriptor, Object identifier) { naturalIdXrefDelegate.removeNaturalIdCrossReference( descriptor, identifier, findCachedNaturalId( descriptor, identifier ) ); } };
@Override public void handleSynchronization(EntityTypeDescriptor descriptor, Object pk, Object entity) { if ( descriptor.getHierarchy().getNaturalIdDescriptor() == null ) { // nothing to do return; } descriptor = locateProperDescriptor( descriptor ); final Object[] naturalIdValuesFromCurrentObjectState = extractNaturalIdValues( entity, descriptor ); final boolean changed = ! naturalIdXrefDelegate.sameAsCached( descriptor, pk, naturalIdValuesFromCurrentObjectState ); if ( changed ) { final Object[] cachedNaturalIdValues = naturalIdXrefDelegate.findCachedNaturalId( descriptor, pk ); naturalIdXrefDelegate.cacheNaturalIdCrossReference( descriptor, pk, naturalIdValuesFromCurrentObjectState ); naturalIdXrefDelegate.stashInvalidNaturalIdReference( descriptor, cachedNaturalIdValues ); removeSharedNaturalIdCrossReference( descriptor, pk, cachedNaturalIdValues ); } }
managedSharedCacheEntries( descriptor, cacheAccess,
@Override public void manageLocalNaturalIdCrossReference( EntityTypeDescriptor descriptor, Object id, Object[] state, Object[] previousState, CachedNaturalIdValueSource source) { if ( descriptor.getHierarchy().getNaturalIdDescriptor() == null ) { // nothing to do return; } descriptor = locateProperDescriptor( descriptor ); final Object[] naturalIdValues = extractNaturalIdValues( state, descriptor ); // cache naturalIdXrefDelegate.cacheNaturalIdCrossReference( descriptor, id, naturalIdValues ); }
@Override public void handleSynchronization(EntityPersister persister, Serializable pk, Object entity) { if ( !persister.hasNaturalIdentifier() ) { // nothing to do return; } persister = locateProperPersister( persister ); final Object[] naturalIdValuesFromCurrentObjectState = extractNaturalIdValues( entity, persister ); final boolean changed = ! naturalIdXrefDelegate.sameAsCached( persister, pk, naturalIdValuesFromCurrentObjectState ); if ( changed ) { final Object[] cachedNaturalIdValues = naturalIdXrefDelegate.findCachedNaturalId( persister, pk ); naturalIdXrefDelegate.cacheNaturalIdCrossReference( persister, pk, naturalIdValuesFromCurrentObjectState ); naturalIdXrefDelegate.stashInvalidNaturalIdReference( persister, cachedNaturalIdValues ); removeSharedNaturalIdCrossReference( persister, pk, cachedNaturalIdValues ); } }
@Override public void manageSharedNaturalIdCrossReference( EntityPersister persister, final Serializable id, Object[] state, Object[] previousState, CachedNaturalIdValueSource source) { if ( !persister.hasNaturalIdentifier() ) { // nothing to do return; } if ( !persister.hasNaturalIdCache() ) { // nothing to do return; } persister = locateProperPersister( persister ); final Object[] naturalIdValues = extractNaturalIdValues( state, persister ); final Object[] previousNaturalIdValues = previousState == null ? null : extractNaturalIdValues( previousState, persister ); managedSharedCacheEntries( persister, id, naturalIdValues, previousNaturalIdValues, source ); }
@Override public void cacheNaturalIdCrossReferenceFromLoad( EntityPersister persister, Serializable id, Object[] naturalIdValues) { if ( !persister.hasNaturalIdentifier() ) { // nothing to do return; } persister = locateProperPersister( persister ); // 'justAddedLocally' is meant to handle the case where we would get double stats jounaling // from a single load event. The first put journal would come from the natural id resolution; // the second comes from the entity loading. In this condition, we want to avoid the multiple // 'put' stats incrementing. final boolean justAddedLocally = naturalIdXrefDelegate.cacheNaturalIdCrossReference( persister, id, naturalIdValues ); if ( justAddedLocally && persister.hasNaturalIdCache() ) { managedSharedCacheEntries( persister, id, naturalIdValues, null, CachedNaturalIdValueSource.LOAD ); } }
@Override public void manageLocalNaturalIdCrossReference( EntityPersister persister, Serializable id, Object[] state, Object[] previousState, CachedNaturalIdValueSource source) { if ( !persister.hasNaturalIdentifier() ) { // nothing to do return; } persister = locateProperPersister( persister ); final Object[] naturalIdValues = extractNaturalIdValues( state, persister ); // cache naturalIdXrefDelegate.cacheNaturalIdCrossReference( persister, id, naturalIdValues ); }
@Override public void handleEviction(Object object, EntityPersister persister, Serializable identifier) { naturalIdXrefDelegate.removeNaturalIdCrossReference( persister, identifier, findCachedNaturalId( persister, identifier ) ); } };