/** * Attempts to resolve the entity id corresponding to the event's natural id values from the session * * @param event The load event * * @return The entity from the cache, or null. */ protected Serializable resolveFromCache(final ResolveNaturalIdEvent event) { return event.getSession().getPersistenceContext().getNaturalIdHelper().findCachedNaturalIdResolution( event.getEntityPersister(), event.getOrderedNaturalIdValues() ); }
/** * Handle sending notifications needed for natural-id before saving */ protected void handleNaturalIdPreSaveNotifications() { // before save, we need to add a local (transactional) natural id cross-reference getSession().getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( getPersister(), getId(), state, null, CachedNaturalIdValueSource.INSERT ); }
private Object[] determinePreviousNaturalIdValues( EntityPersister persister, Object[] previousState, SharedSessionContractImplementor session, Serializable id) { if ( ! persister.hasNaturalIdentifier() ) { return null; } if ( previousState != null ) { return session.getPersistenceContext().getNaturalIdHelper().extractNaturalIdValues( previousState, persister ); } return session.getPersistenceContext().getNaturalIdSnapshot( id, persister ); }
session.getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( persister, id,
/** * Constructs an EntityDeleteAction. * * @param id The entity identifier * @param state The current (extracted) entity state * @param version The current entity version * @param instance The entity instance * @param persister The entity persister * @param isCascadeDeleteEnabled Whether cascade delete is enabled * @param session The session */ public EntityDeleteAction( final Serializable id, final Object[] state, final Object version, final Object instance, final EntityPersister persister, final boolean isCascadeDeleteEnabled, final SessionImplementor session) { super( session, id, instance, persister ); this.version = version; this.isCascadeDeleteEnabled = isCascadeDeleteEnabled; this.state = state; // before remove we need to remove the local (transactional) natural id cross-reference naturalIdValues = session.getPersistenceContext().getNaturalIdHelper().removeLocalNaturalIdCrossReference( getPersister(), getId(), state ); }
/** * Handle sending notifications needed for natural-id after saving * * @param generatedId The generated entity identifier */ public void handleNaturalIdPostSaveNotifications(Serializable generatedId) { if ( isEarlyInsert() ) { // with early insert, we still need to add a local (transactional) natural id cross-reference getSession().getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( getPersister(), generatedId, state, null, CachedNaturalIdValueSource.INSERT ); } // after save, we need to manage the shared cache entries getSession().getPersistenceContext().getNaturalIdHelper().manageSharedNaturalIdCrossReference( getPersister(), generatedId, state, null, CachedNaturalIdValueSource.INSERT ); } }
@Override public void setReadOnly(boolean readOnly, Object entity) { if ( readOnly == isReadOnly() ) { // simply return since the status is not being changed return; } if ( readOnly ) { setStatus( Status.READ_ONLY ); loadedState = null; } else { if ( ! persister.isMutable() ) { throw new IllegalStateException( "Cannot make an immutable entity modifiable." ); } setStatus( Status.MANAGED ); loadedState = getPersister().getPropertyValues( entity ); getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( persister, id, loadedState, null, CachedNaturalIdValueSource.LOAD ); } }
event.getSession().getPersistenceContext().getNaturalIdHelper().cacheNaturalIdCrossReferenceFromLoad( event.getEntityPersister(), pk,
for ( Serializable pk : getPersistenceContext().getNaturalIdHelper() .getCachedPkResolutions( entityPersister ) ) { final EntityKey entityKey = generateEntityKey( pk, entityPersister ); getPersistenceContext().getNaturalIdHelper().handleSynchronization( entityPersister, pk,
private void handleNaturalIdReattachment(Object entity, SharedSessionContractImplementor session) { if ( !hasNaturalIdentifier() ) { return; } if ( getEntityMetamodel().hasImmutableNaturalId() ) { // we assume there were no changes to natural id during detachment for now, that is validated later // during flush. return; } final NaturalIdHelper naturalIdHelper = session.getPersistenceContext().getNaturalIdHelper(); final Serializable id = getIdentifier( entity, session ); // for reattachment of mutable natural-ids, we absolutely positively have to grab the snapshot from the // database, because we have no other way to know if the state changed while detached. final Object[] naturalIdSnapshot; final Object[] entitySnapshot = session.getPersistenceContext().getDatabaseSnapshot( id, this ); if ( entitySnapshot == StatefulPersistenceContext.NO_ROW ) { naturalIdSnapshot = null; } else { naturalIdSnapshot = naturalIdHelper.extractNaturalIdValues( entitySnapshot, this ); } naturalIdHelper.removeSharedNaturalIdCrossReference( this, id, naturalIdSnapshot ); naturalIdHelper.manageLocalNaturalIdCrossReference( this, id, naturalIdHelper.extractNaturalIdValues( entity, this ), naturalIdSnapshot, CachedNaturalIdValueSource.UPDATE ); }
session.getPersistenceContext().getNaturalIdHelper().handleEviction( object, persister,
: session.getPersistenceContext().getNaturalIdHelper().extractNaturalIdValues( loaded, persister );
event.getSession().getPersistenceContext().getNaturalIdHelper().cacheNaturalIdCrossReferenceFromLoad( persister, event.getEntityId(), event.getSession().getPersistenceContext().getNaturalIdHelper().extractNaturalIdValues( entity, persister
persistenceContext.getNaturalIdHelper().removeSharedNaturalIdCrossReference( persister, id, naturalIdValues );
persistenceContext.getNaturalIdHelper().cacheNaturalIdCrossReferenceFromLoad( persister, id, persistenceContext.getNaturalIdHelper().extractNaturalIdValues( hydratedState, persister ) );
session.getPersistenceContext().getNaturalIdHelper().manageSharedNaturalIdCrossReference( persister, id,
/** * Handle sending notifications needed for natural-id before saving */ protected void handleNaturalIdPreSaveNotifications() { // before save, we need to add a local (transactional) natural id cross-reference getSession().getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( getEntityDescriptor(), getId(), state, null, CachedNaturalIdValueSource.INSERT ); }
/** * Attempts to resolve the entity id corresponding to the event's natural id values from the session * * @param event The load event * * @return The entity from the cache, or null. */ protected Object resolveFromCache(final ResolveNaturalIdEvent event) { return event.getSession().getPersistenceContext().getNaturalIdHelper().findCachedNaturalIdResolution( event.getEntityDescriptor(), event.getOrderedNaturalIdValues() ); }
private Object[] determinePreviousNaturalIdValues( EntityTypeDescriptor entityDescriptor, Object[] previousState, SharedSessionContractImplementor session, Object id) { if ( entityDescriptor.getHierarchy().getNaturalIdDescriptor() == null ) { return null; } if ( previousState != null ) { return session.getPersistenceContext().getNaturalIdHelper().extractNaturalIdValues( previousState, entityDescriptor ); } return session.getPersistenceContext().getNaturalIdSnapshot( id, entityDescriptor ); }
@Override public void setReadOnly(boolean readOnly, Object entity) { if ( readOnly == isReadOnly() ) { // simply return since the status is not being changed return; } if ( readOnly ) { setStatus( Status.READ_ONLY ); loadedState = null; } else { if ( ! descriptor.getJavaTypeDescriptor().getMutabilityPlan().isMutable() ) { throw new IllegalStateException( "Cannot make an immutable entity modifiable." ); } setStatus( Status.MANAGED ); loadedState = getDescriptor().getPropertyValues( entity ); getPersistenceContext().getNaturalIdHelper().manageLocalNaturalIdCrossReference( descriptor, id, loadedState, null, CachedNaturalIdValueSource.LOAD ); } }