Package org.hibernate.engine.spi

Examples of org.hibernate.engine.spi.EntityEntry


   * Flushes a single entity's state to the database, by scheduling
   * an update action, if necessary
   */
  public void onFlushEntity(FlushEntityEvent event) throws HibernateException {
    final Object entity = event.getEntity();
    final EntityEntry entry = event.getEntityEntry();
    final EventSource session = event.getSession();
    final EntityPersister persister = entry.getPersister();
    final Status status = entry.getStatus();
    final Type[] types = persister.getPropertyTypes();

    final boolean mightBeDirty = entry.requiresDirtyCheck( entity );

    final Object[] values = getValues( entity, entry, mightBeDirty, session );

    event.setPropertyValues( values );

View Full Code Here


      return hasDirtyCollections( event, event.getEntityEntry().getPersister(), status );
    }
  }

  private boolean scheduleUpdate(final FlushEntityEvent event) {
    final EntityEntry entry = event.getEntityEntry();
    final EventSource session = event.getSession();
    final Object entity = event.getEntity();
    final Status status = entry.getStatus();
    final EntityPersister persister = entry.getPersister();
    final Object[] values = event.getPropertyValues();

    if ( LOG.isTraceEnabled() ) {
      if ( status == Status.DELETED ) {
        if ( !persister.isMutable() ) {
          LOG.tracev(
              "Updating immutable, deleted entity: {0}",
              MessageHelper.infoString( persister, entry.getId(), session.getFactory() )
          );
        }
        else if ( !entry.isModifiableEntity() ) {
          LOG.tracev(
              "Updating non-modifiable, deleted entity: {0}",
              MessageHelper.infoString( persister, entry.getId(), session.getFactory() )
          );
        }
        else {
          LOG.tracev(
              "Updating deleted entity: ",
              MessageHelper.infoString( persister, entry.getId(), session.getFactory() )
          );
        }
      }
      else {
        LOG.tracev(
            "Updating entity: {0}",
            MessageHelper.infoString( persister, entry.getId(), session.getFactory() )
        );
      }
    }

    final boolean intercepted = !entry.isBeingReplicated() && handleInterception( event );

    // increment the version number (if necessary)
    final Object nextVersion = getNextVersion( event );

    // if it was dirtied by a collection only
    int[] dirtyProperties = event.getDirtyProperties();
    if ( event.isDirtyCheckPossible() && dirtyProperties == null ) {
      if ( !intercepted && !event.hasDirtyCollection() ) {
        throw new AssertionFailure( "dirty, but no dirty properties" );
      }
      dirtyProperties = ArrayHelper.EMPTY_INT_ARRAY;
    }

    // check nullability but do not doAfterTransactionCompletion command execute
    // we'll use scheduled updates for that.
    new Nullability( session ).checkNullability( values, persister, true );

    // schedule the update
    // note that we intentionally do _not_ pass in currentPersistentState!
    session.getActionQueue().addAction(
        new EntityUpdateAction(
            entry.getId(),
            values,
            dirtyProperties,
            event.hasDirtyCollection(),
            ( status == Status.DELETED && !entry.isModifiableEntity() ?
                persister.getPropertyValues( entity ) :
                entry.getLoadedState() ),
            entry.getVersion(),
            nextVersion,
            entity,
            entry.getRowId(),
            persister,
            session
        )
    );
View Full Code Here

    return intercepted;
  }

  protected boolean handleInterception(FlushEntityEvent event) {
    SessionImplementor session = event.getSession();
    EntityEntry entry = event.getEntityEntry();
    EntityPersister persister = entry.getPersister();
    Object entity = event.getEntity();

    //give the Interceptor a chance to modify property values
    final Object[] values = event.getPropertyValues();
    final boolean intercepted = invokeInterceptor( session, entity, entry, values, persister );

    //now we might need to recalculate the dirtyProperties array
    if ( intercepted && event.isDirtyCheckPossible() && !event.isDirtyCheckHandledByInterceptor() ) {
      int[] dirtyProperties;
      if ( event.hasDatabaseSnapshot() ) {
        dirtyProperties = persister.findModified( event.getDatabaseSnapshot(), values, entity, session );
      }
      else {
        dirtyProperties = persister.findDirty( values, entry.getLoadedState(), entity, session );
      }
      event.setDirtyProperties( dirtyProperties );
    }

    return intercepted;
View Full Code Here

  /**
   * Convience method to retreive an entities next version value
   */
  private Object getNextVersion(FlushEntityEvent event) throws HibernateException {

    EntityEntry entry = event.getEntityEntry();
    EntityPersister persister = entry.getPersister();
    if ( persister.isVersioned() ) {

      Object[] values = event.getPropertyValues();

      if ( entry.isBeingReplicated() ) {
        return Versioning.getVersion( values, persister );
      }
      else {
        int[] dirtyProperties = event.getDirtyProperties();

        final boolean isVersionIncrementRequired = isVersionIncrementRequired(
            event,
            entry,
            persister,
            dirtyProperties
        );

        final Object nextVersion = isVersionIncrementRequired ?
            Versioning.increment( entry.getVersion(), persister.getVersionType(), event.getSession() ) :
            entry.getVersion(); //use the current version

        Versioning.setVersion( values, nextVersion, persister );

        return nextVersion;
      }
View Full Code Here

  protected void dirtyCheck(final FlushEntityEvent event) throws HibernateException {

    final Object entity = event.getEntity();
    final Object[] values = event.getPropertyValues();
    final SessionImplementor session = event.getSession();
    final EntityEntry entry = event.getEntityEntry();
    final EntityPersister persister = entry.getPersister();
    final Serializable id = entry.getId();
    final Object[] loadedState = entry.getLoadedState();

    int[] dirtyProperties = session.getInterceptor().findDirty(
        entity,
        id,
        values,
        loadedState,
        persister.getPropertyNames(),
        persister.getPropertyTypes()
    );

    if ( dirtyProperties == null ) {
      if ( entity instanceof SelfDirtinessTracker ) {
        if ( ( (SelfDirtinessTracker) entity ).$$_hibernate_hasDirtyAttributes() ) {
          dirtyProperties = persister.resolveAttributeIndexes( ( (SelfDirtinessTracker) entity ).$$_hibernate_getDirtyAttributes() );
        }
      }
      else {
        // see if the custom dirtiness strategy can tell us...
        class DirtyCheckContextImpl implements CustomEntityDirtinessStrategy.DirtyCheckContext {
          int[] found;

          @Override
          public void doDirtyChecking(CustomEntityDirtinessStrategy.AttributeChecker attributeChecker) {
            found = new DirtyCheckAttributeInfoImpl( event ).visitAttributes( attributeChecker );
            if ( found != null && found.length == 0 ) {
              found = null;
            }
          }
        }
        DirtyCheckContextImpl context = new DirtyCheckContextImpl();
        session.getFactory().getCustomEntityDirtinessStrategy().findDirty(
            entity,
            persister,
            (Session) session,
            context
        );
        dirtyProperties = context.found;
      }
    }

    event.setDatabaseSnapshot( null );

    final boolean interceptorHandledDirtyCheck;
    boolean cannotDirtyCheck;

    if ( dirtyProperties == null ) {
      // Interceptor returned null, so do the dirtycheck ourself, if possible
      try {
        session.getEventListenerManager().dirtyCalculationStart();

        interceptorHandledDirtyCheck = false;
        // object loaded by update()
        cannotDirtyCheck = loadedState == null;
        if ( !cannotDirtyCheck ) {
          // dirty check against the usual snapshot of the entity
          dirtyProperties = persister.findDirty( values, loadedState, entity, session );
        }
        else if ( entry.getStatus() == Status.DELETED && !event.getEntityEntry().isModifiableEntity() ) {
          // A non-modifiable (e.g., read-only or immutable) entity needs to be have
          // references to transient entities set to null before being deleted. No other
          // fields should be updated.
          if ( values != entry.getDeletedState() ) {
            throw new IllegalStateException(
                "Entity has status Status.DELETED but values != entry.getDeletedState"
            );
          }
          // Even if loadedState == null, we can dirty-check by comparing currentState and
          // entry.getDeletedState() because the only fields to be updated are those that
          // refer to transient entities that are being set to null.
          // - currentState contains the entity's current property values.
          // - entry.getDeletedState() contains the entity's current property values with
          //   references to transient entities set to null.
          // - dirtyProperties will only contain properties that refer to transient entities
          final Object[] currentState = persister.getPropertyValues( event.getEntity() );
          dirtyProperties = persister.findDirty( entry.getDeletedState(), currentState, entity, session );
          cannotDirtyCheck = false;
        }
        else {
          // dirty check against the database snapshot, if possible/necessary
          final Object[] databaseSnapshot = getDatabaseSnapshot( session, persister, id );
View Full Code Here

    final Object anything = getAnything();
    //safe from concurrent modification because of how concurrentEntries() is implemented on IdentityMap
    for ( Map.Entry<Object,EntityEntry> me : persistenceContext.reentrantSafeEntityEntries() ) {
//    for ( Map.Entry me : IdentityMap.concurrentEntries( persistenceContext.getEntityEntries() ) ) {
      EntityEntry entry = (EntityEntry) me.getValue();
      Status status = entry.getStatus();
      if ( status == Status.MANAGED || status == Status.SAVING || status == Status.READ_ONLY ) {
        cascadeOnFlush( session, entry.getPersister(), me.getKey(), anything );
      }
    }
  }
View Full Code Here

    for ( Map.Entry<Object,EntityEntry> me : entityEntries ) {

      // Update the status of the object and if necessary, schedule an update

      EntityEntry entry = me.getValue();
      Status status = entry.getStatus();

      if ( status != Status.LOADING && status != Status.GONE ) {
        final FlushEntityEvent entityEvent = new FlushEntityEvent( source, me.getKey(), entry );
        for ( FlushEntityEventListener listener : flushListeners ) {
          listener.onFlushEntity( entityEvent );
View Full Code Here

      persistenceContext.removeProxy( key );

      if ( !li.isUninitialized() ) {
        final Object entity = persistenceContext.removeEntity( key );
        if ( entity != null ) {
          EntityEntry e = persistenceContext.removeEntry( entity );
          doEvict( entity, key, e.getPersister(), event.getSession() );
        }
      }
      li.unsetSession();
    }
    else {
      EntityEntry e = persistenceContext.removeEntry( object );
      if ( e != null ) {
        persistenceContext.removeEntity( e.getEntityKey() );
        doEvict( object, e.getEntityKey(), e.getPersister(), source );
      }
      else {
        // see if the passed object is even an entity, and if not throw an exception
        //     this is different than legacy Hibernate behavior, but what JPA 2.1 is calling for
        //    with EntityManager.detach
View Full Code Here

    EventSource eventSource = event.getSession();
    handlePostUpdate(entity, eventSource);
  }

  private void handlePostUpdate(Object entity, EventSource source) {
    EntityEntry entry = (EntityEntry) source.getPersistenceContext()
        .getEntityEntries().get(entity);
    // mimic the preUpdate filter
    if ( Status.DELETED != entry.getStatus()) {
      callbackHandler.postUpdate(entity);
    }
  }
View Full Code Here

  private Serializable getId(Object entity, AbstractCollectionEvent event) {
    Serializable id = event.getAffectedOwnerIdOrNull();
    if ( id == null ) {
      // most likely this recovery is unnecessary since Hibernate Core probably try that
      EntityEntry entityEntry = event.getSession().getPersistenceContext().getEntry( entity );
      id = entityEntry == null ? null : entityEntry.getId();
    }
    return id;
  }
View Full Code Here

TOP

Related Classes of org.hibernate.engine.spi.EntityEntry

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.