Package org.hibernate.event.spi

Examples of org.hibernate.event.spi.EventSource


  }

  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(),
View Full Code Here


   */
  protected void flushEverythingToExecutions(FlushEvent event) throws HibernateException {

        LOG.trace("Flushing session");

    EventSource session = event.getSession();

    final PersistenceContext persistenceContext = session.getPersistenceContext();
    session.getInterceptor().preFlush( new LazyIterator( persistenceContext.getEntitiesByKey() ) );

    prepareEntityFlushes(session);
    // we could move this inside if we wanted to
    // tolerate collection initializations during
    // collection dirty checking:
    prepareCollectionFlushes(session);
    // now, any collections that are initialized
    // inside this block do not get updated - they
    // are ignored until the next flush

    persistenceContext.setFlushing(true);
    try {
      flushEntities(event);
      flushCollections(session);
    }
    finally {
      persistenceContext.setFlushing(false);
    }

    //some statistics
        if (LOG.isDebugEnabled()) {
            LOG.debugf(
          "Flushed: %s insertions, %s updates, %s deletions to %s objects",
          session.getActionQueue().numberOfInsertions(),
          session.getActionQueue().numberOfUpdates(),
          session.getActionQueue().numberOfDeletions(),
          persistenceContext.getEntityEntries().size()
      );
            LOG.debugf(
          "Flushed: %s (re)creations, %s updates, %s removals to %s collections",
          session.getActionQueue().numberOfCollectionCreations(),
          session.getActionQueue().numberOfCollectionUpdates(),
          session.getActionQueue().numberOfCollectionRemovals(),
          persistenceContext.getCollectionEntries().size()
      );
      new EntityPrinter( session.getFactory() ).toString(
          persistenceContext.getEntitiesByKey().values().iterator()
      );
    }
  }
View Full Code Here

    // be loaded.

    // So this needs to be safe from concurrent modification problems.
    // It is safe because of how IdentityMap implements entrySet()

    final EventSource source = event.getSession();

    final Map.Entry[] list = IdentityMap.concurrentEntries( source.getPersistenceContext().getEntityEntries() );
    final int size = list.length;
    for ( int i = 0; i < size; i++ ) {

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

      Map.Entry me = list[i];
      EntityEntry entry = (EntityEntry) me.getValue();
      Status status = entry.getStatus();

      if ( status != Status.LOADING && status != Status.GONE ) {
        final FlushEntityEvent entityEvent = new FlushEntityEvent( source, me.getKey(), entry );
        final EventListenerGroup<FlushEntityEventListener> listenerGroup = source
            .getFactory()
            .getServiceRegistry()
            .getService( EventListenerRegistry.class )
            .getEventListenerGroup( EventType.FLUSH_ENTITY );
        for ( FlushEntityEventListener listener : listenerGroup.listeners() ) {
          listener.onFlushEntity( entityEvent );
        }
      }
    }

    source.getActionQueue().sortActions();
  }
View Full Code Here

   * 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);
View Full Code Here

  }

  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(),
View Full Code Here

   */
  private void flushEntities(final FlushEvent event, final PersistenceContext persistenceContext) throws HibernateException {

    LOG.trace( "Flushing entities and processing referenced collections" );

    final EventSource source = event.getSession();
    final Iterable<FlushEntityEventListener> flushListeners = source
        .getFactory()
        .getServiceRegistry()
        .getService( EventListenerRegistry.class )
        .getEventListenerGroup( EventType.FLUSH_ENTITY )
        .listeners();

    // Among other things, updateReachables() will recursively load all
    // collections that are moving roles. This might cause entities to
    // be loaded.

    // So this needs to be safe from concurrent modification problems.
    // It is safe because of how IdentityMap implements entrySet()

    for ( Map.Entry<Object,EntityEntry> me : persistenceContext.reentrantSafeEntityEntries() ) {
//    for ( Map.Entry me : IdentityMap.concurrentEntries( persistenceContext.getEntityEntries() ) ) {

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

      EntityEntry entry = (EntityEntry) 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 );
        }
      }
    }

    source.getActionQueue().sortActions();
  }
View Full Code Here

      CacheEntry entry,
      Serializable entityId,
      EntityPersister persister,
      LoadEvent event) {

    final EventSource session = event.getSession();
    final SessionFactoryImplementor factory = session.getFactory();
    final EntityPersister subclassPersister = factory.getEntityPersister( entry.getSubclass() );

    if ( LOG.isTraceEnabled() ) {
      LOG.tracef(
          "Converting second-level cache entry [%s] into entity : %s",
          entry,
          MessageHelper.infoString( persister, entityId, factory )
      );
    }

    final Object entity;
    if ( entry.isReferenceEntry() ) {
      final Object optionalObject = event.getInstanceToLoad();
      if ( optionalObject != null ) {
        throw new HibernateException(
            String.format(
                "Attempt to load entity [%s] from cache using provided object instance, but cache " +
                    "is storing references",
                MessageHelper.infoString( persister, entityId, factory )
            )
        );
      }

      entity = ( (ReferenceCacheEntryImpl) entry ).getReference();
      if ( entity == null ) {
        throw new IllegalStateException(
            "Reference cache entry contained null : " + MessageHelper.infoString( persister, entityId, factory )
        );
      }
    }
    else {
      final Object optionalObject = event.getInstanceToLoad();
      entity = optionalObject == null
          ? session.instantiate( subclassPersister, entityId )
          : optionalObject;
    }

    // make it circular-reference safe
    final EntityKey entityKey = session.generateEntityKey( entityId, subclassPersister );
    TwoPhaseLoad.addUninitializedCachedEntity(
        entityKey,
        entity,
        subclassPersister,
        LockMode.NONE,
        entry.areLazyPropertiesUnfetched(),
        entry.getVersion(),
        session
    );

    final PersistenceContext persistenceContext = session.getPersistenceContext();
    final Object[] values;
    final Object version;
    final boolean isReadOnly;
    if ( entry.isReferenceEntry() ) {
      values = null;
      version = null;
      isReadOnly = true;
    }
    else {
      final Type[] types = subclassPersister.getPropertyTypes();
      // initializes the entity by (desired) side-effect
      values = ( (StandardCacheEntryImpl) entry).assemble(
          entity, entityId, subclassPersister, session.getInterceptor(), session
      );
      if ( ( (StandardCacheEntryImpl) entry ).isDeepCopyNeeded() ) {
        TypeHelper.deepCopy(
            values,
            types,
            subclassPersister.getPropertyUpdateability(),
            values,
            session
        );
      }
      version = Versioning.getVersion( values, subclassPersister );
      LOG.tracef( "Cached Version : %s", version );

      final Object proxy = persistenceContext.getProxy( entityKey );
      if ( proxy != null ) {
        // there is already a proxy for this impl
        // only set the status to read-only if the proxy is read-only
        isReadOnly = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer().isReadOnly();
      }
      else {
        isReadOnly = session.isDefaultReadOnly();
      }
    }

    persistenceContext.addEntry(
        entity,
View Full Code Here

      final Serializable id,
      final EntityPersister persister,
      final LoadEvent event) throws HibernateException {

    final Object optionalObject = event.getInstanceToLoad();
    final EventSource session = event.getSession();
    final SessionFactoryImplementor factory = session.getFactory();

    if ( LOG.isTraceEnabled() ) {
      LOG.tracev( "Assembling entity from second-level cache: {0}",
          MessageHelper.infoString( persister, id, factory ) );
    }

    EntityPersister subclassPersister = factory.getEntityPersister( entry.getSubclass() );
    Object result = optionalObject == null ?
        session.instantiate( subclassPersister, id ) : optionalObject;

    // make it circular-reference safe
    final EntityKey entityKey = session.generateEntityKey( id, subclassPersister );
    TwoPhaseLoad.addUninitializedCachedEntity(
        entityKey,
        result,
        subclassPersister,
        LockMode.NONE,
        entry.areLazyPropertiesUnfetched(),
        entry.getVersion(),
        session
      );

    Type[] types = subclassPersister.getPropertyTypes();
    Object[] values = entry.assemble( result, id, subclassPersister, session.getInterceptor(), session ); // intializes result by side-effect
    TypeHelper.deepCopy(
        values,
        types,
        subclassPersister.getPropertyUpdateability(),
        values,
        session
    );

    Object version = Versioning.getVersion( values, subclassPersister );
    LOG.tracev( "Cached Version: {0}", version );

    final PersistenceContext persistenceContext = session.getPersistenceContext();
    boolean isReadOnly = session.isDefaultReadOnly();
    if ( persister.isMutable() ) {
      Object proxy = persistenceContext.getProxy( entityKey );
      if ( proxy != null ) {
        // there is already a proxy for this impl
        // only set the status to read-only if the proxy is read-only
View Full Code Here

   *
   * @param event The flush event to be handled.
   * @throws HibernateException
   */
  public void onFlush(FlushEvent event) throws HibernateException {
    final EventSource source = event.getSession();
    final PersistenceContext persistenceContext = source.getPersistenceContext();
    if ( persistenceContext.getNumberOfManagedEntities() > 0 ||
        persistenceContext.getCollectionEntries().size() > 0 ) {

      flushEverythingToExecutions(event);
      performExecutions(source);
      postFlush(source);
   
      if ( source.getFactory().getStatistics().isStatisticsEnabled() ) {
        source.getFactory().getStatisticsImplementor().flush();
      }

    }
  }
View Full Code Here

   * @param event
   *            The auto-flush event to be handled.
   * @throws HibernateException
   */
  public void onAutoFlush(AutoFlushEvent event) throws HibernateException {
    final EventSource source = event.getSession();
    if ( flushMightBeNeeded(source) ) {
      // Need to get the number of collection removals before flushing to executions
      // (because flushing to executions can add collection removal actions to the action queue).
      final int oldSize = source.getActionQueue().numberOfCollectionRemovals();
      flushEverythingToExecutions(event);
      if ( flushIsReallyNeeded(event, source) ) {
        LOG.trace( "Need to execute flush" );

        performExecutions(source);
        postFlush(source);
        // note: performExecutions() clears all collectionXxxxtion
        // collections (the collection actions) in the session

        if ( source.getFactory().getStatistics().isStatisticsEnabled() ) {
          source.getFactory().getStatisticsImplementor().flush();
        }
      }
      else {
        LOG.trace( "Don't need to execute flush" );
        source.getActionQueue().clearFromFlushNeededCheck( oldSize );
      }

      event.setFlushRequired( flushIsReallyNeeded( event, source ) );
    }
  }
View Full Code Here

TOP

Related Classes of org.hibernate.event.spi.EventSource

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.