@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 Serializable findCachedNaturalIdResolution(EntityPersister persister, Object[] naturalIdValues) { return naturalIdXrefDelegate.findCachedNaturalIdResolution( locateProperPersister( persister ), naturalIdValues ); }
@Override public Collection<Serializable> getCachedPkResolutions(EntityPersister entityPersister) { return naturalIdXrefDelegate.getCachedPkResolutions( entityPersister ); }
persister = locatePersisterForKey( persister ); validateNaturalId( persister, naturalIdValues ); final NaturalIdDataAccess naturalIdCacheAccessStrategy = persister .getNaturalIdCacheAccessStrategy(); final Object naturalIdCacheKey = naturalIdCacheAccessStrategy.generateCacheKey( naturalIdValues, persister, session() ); naturalIdCacheAccessStrategy.evict( naturalIdCacheKey ); final Object sessionNaturalIdCacheKey = naturalIdCacheAccessStrategy.generateCacheKey( sessionCachedNaturalIdValues, persister, session() ); naturalIdCacheAccessStrategy.evict( sessionNaturalIdCacheKey );
entityDescriptor = locateDescriptorForKey( entityDescriptor ); validateNaturalId( entityDescriptor, naturalIdValues ); final Object naturalIdCacheKey = cacheAccess.generateCacheKey( naturalIdValues, entityDescriptor.getHierarchy(), session() ); cacheAccess.evict( naturalIdCacheKey ); final Object sessionNaturalIdCacheKey = cacheAccess.generateCacheKey( sessionCachedNaturalIdValues, entityDescriptor.getHierarchy(), session() ); cacheAccess.evict( sessionNaturalIdCacheKey );
@Override public void handleEviction(Object object, EntityPersister persister, Serializable identifier) { naturalIdXrefDelegate.removeNaturalIdCrossReference( persister, identifier, findCachedNaturalId( persister, identifier ) ); } };
@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 Object[] findCachedNaturalId(EntityPersister persister, Serializable pk) { return naturalIdXrefDelegate.findCachedNaturalId( locateProperPersister( persister ), pk ); }
@Override public void cleanupFromSynchronizations() { naturalIdXrefDelegate.unStashInvalidNaturalIdReferences(); }
loadContexts.cleanup(); naturalIdXrefDelegate.clear();
persister = locatePersisterForKey( persister ); validateNaturalId( persister, naturalIdValues ); final Object naturalIdCacheKey = naturalIdCacheAccessStrategy.generateCacheKey( naturalIdValues, persister, session() ); pk = CacheHelper.fromSharedCache( session(), naturalIdCacheKey, naturalIdCacheAccessStrategy ); final SessionFactoryImplementor factory = session().getFactory(); if ( pk != null ) { if ( factory.getStatistics().isStatisticsEnabled() ) {
entityDescriptor = locateDescriptorForKey( entityDescriptor ); validateNaturalId( entityDescriptor, naturalIdValues ); naturalIdValues, entityDescriptor.getHierarchy(), session() ); pk = CacheHelper.fromSharedCache( session(), naturalIdCacheKey, cacheAccess ); final SessionFactoryImplementor factory = session().getFactory(); if ( pk != null ) { if ( factory.getStatistics().isStatisticsEnabled() ) {
@Override public Object[] removeLocalNaturalIdCrossReference(EntityPersister persister, Serializable id, Object[] state) { if ( !persister.hasNaturalIdentifier() ) { // nothing to do return null; } persister = locateProperPersister( persister ); final Object[] naturalIdValues = getNaturalIdValues( state, persister ); final Object[] localNaturalIdValues = naturalIdXrefDelegate.removeNaturalIdCrossReference( persister, id, naturalIdValues ); return localNaturalIdValues != null ? localNaturalIdValues : naturalIdValues; }
@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 Object[] findCachedNaturalId(EntityTypeDescriptor descriptor, Object pk) { return naturalIdXrefDelegate.findCachedNaturalId( locateProperDescriptor( descriptor ), pk ); }
@Override public void cleanupFromSynchronizations() { naturalIdXrefDelegate.unStashInvalidNaturalIdReferences(); }
loadContexts.cleanup(); naturalIdXrefDelegate.clear();
@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 ); } }
@Override public void handleEviction(Object object, EntityTypeDescriptor descriptor, Object identifier) { naturalIdXrefDelegate.removeNaturalIdCrossReference( descriptor, identifier, findCachedNaturalId( descriptor, identifier ) ); } };
@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 ); }