Package org.hibernate.event.spi

Examples of org.hibernate.event.spi.EventSource


   */
  @SuppressWarnings({"unchecked"})
  protected void entityIsTransient(PersistEvent event, Map createCache) {
    LOG.trace( "Saving transient instance" );

    final EventSource source = event.getSession();
    final Object entity = source.getPersistenceContext().unproxy( event.getObject() );

    if ( createCache.put( entity, entity ) == null ) {
      saveWithGeneratedId( entity, event.getEntityName(), createCache, source, false );
    }
  }
View Full Code Here


    }
  }

  @SuppressWarnings({"unchecked"})
  private void entityIsDeleted(PersistEvent event, Map createCache) {
    final EventSource source = event.getSession();

    final Object entity = source.getPersistenceContext().unproxy( event.getObject() );
    final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );

    LOG.tracef(
        "un-scheduling entity deletion [%s]",
        MessageHelper.infoString(
            persister,
            persister.getIdentifier( entity, source ),
            source.getFactory()
        )
    );

    if ( createCache.put( entity, entity ) == null ) {
      justCascade( createCache, source, entity, persister );
View Full Code Here

   *
   * @param event The refresh event to be handled.
   */
  public void onRefresh(RefreshEvent event, Map refreshedAlready) {

    final EventSource source = event.getSession();

    boolean isTransient = !source.contains( event.getObject() );
    if ( source.getPersistenceContext().reassociateIfUninitializedProxy( event.getObject() ) ) {
      if ( isTransient ) {
        source.setReadOnly( event.getObject(), source.isDefaultReadOnly() );
      }
      return;
    }

    final Object object = source.getPersistenceContext().unproxyAndReassociate( event.getObject() );

    if ( refreshedAlready.containsKey( object ) ) {
      LOG.trace( "Already refreshed" );
      return;
    }

    final EntityEntry e = source.getPersistenceContext().getEntry( object );
    final EntityPersister persister;
    final Serializable id;

    if ( e == null ) {
      persister = source.getEntityPersister(
          event.getEntityName(),
          object
      ); //refresh() does not pass an entityName
      id = persister.getIdentifier( object, event.getSession() );
      if ( LOG.isTraceEnabled() ) {
        LOG.tracev(
            "Refreshing transient {0}", MessageHelper.infoString(
            persister,
            id,
            source.getFactory()
        )
        );
      }
      final EntityKey key = source.generateEntityKey( id, persister );
      if ( source.getPersistenceContext().getEntry( key ) != null ) {
        throw new PersistentObjectException(
            "attempted to refresh transient instance when persistent instance was already associated with the Session: " +
                MessageHelper.infoString( persister, id, source.getFactory() )
        );
      }
    }
    else {
      if ( LOG.isTraceEnabled() ) {
        LOG.tracev(
            "Refreshing ", MessageHelper.infoString(
            e.getPersister(),
            e.getId(),
            source.getFactory()
        )
        );
      }
      if ( !e.isExistsInDatabase() ) {
        throw new UnresolvableObjectException(
            e.getId(),
            "this instance does not yet exist as a row in the database"
        );
      }

      persister = e.getPersister();
      id = e.getId();
    }

    // cascade the refresh prior to refreshing this entity
    refreshedAlready.put( object, object );
    new Cascade( CascadingActions.REFRESH, CascadePoint.BEFORE_REFRESH, source ).cascade(
        persister,
        object,
        refreshedAlready
    );

    if ( e != null ) {
      final EntityKey key = source.generateEntityKey( id, persister );
      source.getPersistenceContext().removeEntity( key );
      if ( persister.hasCollections() ) {
        new EvictVisitor( source ).process( object, persister );
      }
    }

    if ( persister.hasCache() ) {
      final CacheKey ck = source.generateCacheKey(
          id,
          persister.getIdentifierType(),
          persister.getRootEntityName()
      );
      persister.getCacheAccessStrategy().evict( ck );
    }

    evictCachedCollections( persister, id, source.getFactory() );

    String previousFetchProfile = source.getLoadQueryInfluencers().getInternalFetchProfile();
    source.getLoadQueryInfluencers().setInternalFetchProfile( "refresh" );
    Object result = persister.load( id, object, event.getLockOptions(), source );
    // Keep the same read-only/modifiable setting for the entity that it had before refreshing;
    // If it was transient, then set it to the default for the source.
    if ( result != null ) {
      if ( !persister.isMutable() ) {
        // this is probably redundant; it should already be read-only
        source.setReadOnly( result, true );
      }
      else {
        source.setReadOnly( result, ( e == null ? source.isDefaultReadOnly() : e.isReadOnly() ) );
      }
    }
    source.getLoadQueryInfluencers().setInternalFetchProfile( previousFetchProfile );

    UnresolvableObjectException.throwIfNull( result, id, persister.getEntityName() );

  }
View Full Code Here

    if ( collection == CollectionType.UNFETCHED_COLLECTION ) {
      return null;
    }

    EventSource session = getSession();
    CollectionPersister persister = session.getFactory().getCollectionPersister( type.getRole() );

    final Serializable collectionKey = extractCollectionKeyFromOwner( persister );
    if ( collection!=null && (collection instanceof PersistentCollection) ) {
      PersistentCollection wrapper = (PersistentCollection) collection;
      if ( wrapper.setCurrentSession(session) ) {
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();
    try {
      source.getEventListenerManager().partialFlushStart();

      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" );

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

          postPostFlush( source );

          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 ) );
      }
    }
    finally {
      source.getEventListenerManager().partialFlushEnd(
          event.getNumberOfEntitiesProcessed(),
          event.getNumberOfEntitiesProcessed()
      );
    }
  }
View Full Code Here

          "Reassociating transient instance: {0}",
          MessageHelper.infoString( persister, id, event.getSession().getFactory() )
      );
    }

    final EventSource source = event.getSession();
    final EntityKey key = source.generateEntityKey( id, persister );

    source.getPersistenceContext().checkUniqueness( key, object );

    //get a snapshot
    Object[] values = persister.getPropertyValues( object );
    TypeHelper.deepCopy(
        values,
        persister.getPropertyTypes(),
        persister.getPropertyUpdateability(),
        values,
        source
    );
    Object version = Versioning.getVersion( values, persister );

    EntityEntry newEntry = source.getPersistenceContext().addEntity(
        object,
        ( persister.isMutable() ? Status.MANAGED : Status.READ_ONLY ),
        values,
        key,
        version,
View Full Code Here

   */
  protected Serializable entityIsTransient(SaveOrUpdateEvent event) {

    LOG.trace( "Saving transient instance" );

    final EventSource source = event.getSession();

    EntityEntry entityEntry = event.getEntry();
    if ( entityEntry != null ) {
      if ( entityEntry.getStatus() == Status.DELETED ) {
        source.forceFlush( entityEntry );
      }
      else {
        throw new AssertionFailure( "entity was persistent" );
      }
    }

    Serializable id = saveWithGeneratedOrRequestedId( event );

    source.getPersistenceContext().reassociateProxy( event.getObject(), id );

    return id;
  }
View Full Code Here

          "Updating {0}",
          MessageHelper.infoString( persister, event.getRequestedId(), event.getSession().getFactory() )
      );
    }

    final EventSource source = event.getSession();
    final EntityKey key = source.generateEntityKey( event.getRequestedId(), persister );

    source.getPersistenceContext().checkUniqueness( key, entity );

    if ( invokeUpdateLifecycle( entity, persister, source ) ) {
      reassociate( event, event.getObject(), event.getRequestedId(), persister );
      return;
    }

    // this is a transient object with existing persistent state not loaded by the session

    new OnUpdateVisitor( source, event.getRequestedId(), entity ).process( entity, persister );

    // TODO: put this stuff back in to read snapshot from
    // the second-level cache (needs some extra work)
    /*Object[] cachedState = null;

        if ( persister.hasCache() ) {
          CacheEntry entry = (CacheEntry) persister.getCache()
              .get( event.getRequestedId(), source.getTimestamp() );
            cachedState = entry==null ?
                null :
                entry.getState(); //TODO: half-assemble this stuff
        }*/

    source.getPersistenceContext().addEntity(
        entity,
        ( persister.isMutable() ? Status.MANAGED : Status.READ_ONLY ),
        null, // cachedState,
        key,
        persister.getVersion( entity ),
        LockMode.NONE,
        true,
        persister,
        false,
        true // assume true, since we don't really know, and it doesn't matter
    );

    persister.afterReassociate( entity, source );

    if ( traceEnabled ) {
      LOG.tracev(
          "Updating {0}", MessageHelper.infoString(
          persister,
          event.getRequestedId(),
          source.getFactory()
      )
      );
    }

    cascadeOnUpdate( event, persister, entity );
View Full Code Here

   * @param event The event currently being processed.
   * @param persister The defined persister for the entity being updated.
   * @param entity The entity being updated.
   */
  private void cascadeOnUpdate(SaveOrUpdateEvent event, EntityPersister persister, Object entity) {
    final EventSource source = event.getSession();
    source.getPersistenceContext().incrementCascadeLevel();
    try {
      new Cascade( CascadingActions.SAVE_UPDATE, CascadePoint.AFTER_UPDATE, source ).cascade( persister, entity );
    }
    finally {
      source.getPersistenceContext().decrementCascadeLevel();
    }
  }
View Full Code Here

   *
   * @throws HibernateException
   */
  public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {

    final EventSource source = event.getSession();

    final PersistenceContext persistenceContext = source.getPersistenceContext();
    Object entity = persistenceContext.unproxyAndReassociate( event.getObject() );

    EntityEntry entityEntry = persistenceContext.getEntry( entity );
    final EntityPersister persister;
    final Serializable id;
    final Object version;

    if ( entityEntry == null ) {
      LOG.trace( "Entity was not persistent in delete processing" );

      persister = source.getEntityPersister( event.getEntityName(), entity );

      if ( ForeignKeys.isTransient( persister.getEntityName(), entity, null, source ) ) {
        deleteTransientEntity( source, entity, event.isCascadeDeleteEnabled(), persister, transientEntities );
        // EARLY EXIT!!!
        return;
      }
      performDetachedEntityDeletionCheck( event );

      id = persister.getIdentifier( entity, source );

      if ( id == null ) {
        throw new TransientObjectException(
            "the detached instance passed to delete() had a null identifier"
        );
      }

      final EntityKey key = source.generateEntityKey( id, persister );

      persistenceContext.checkUniqueness( key, entity );

      new OnUpdateVisitor( source, id, entity ).process( entity, persister );

      version = persister.getVersion( entity );

      entityEntry = persistenceContext.addEntity(
          entity,
          (persister.isMutable() ? Status.MANAGED : Status.READ_ONLY),
          persister.getPropertyValues( entity ),
          key,
          version,
          LockMode.NONE,
          true,
          persister,
          false,
          false
      );
    }
    else {
      LOG.trace( "Deleting a persistent instance" );

      if ( entityEntry.getStatus() == Status.DELETED || entityEntry.getStatus() == Status.GONE ) {
        LOG.trace( "Object was already deleted" );
        return;
      }
      persister = entityEntry.getPersister();
      id = entityEntry.getId();
      version = entityEntry.getVersion();
    }

    /*if ( !persister.isMutable() ) {
      throw new HibernateException(
          "attempted to delete an object of immutable class: " +
          MessageHelper.infoString(persister)
        );
    }*/

    if ( invokeDeleteLifecycle( source, entity, persister ) ) {
      return;
    }

    deleteEntity(
        source,
        entity,
        entityEntry,
        event.isCascadeDeleteEnabled(),
        event.isOrphanRemovalBeforeUpdates(),
        persister,
        transientEntities
    );

    if ( source.getFactory().getSettings().isIdentifierRollbackEnabled() ) {
      persister.resetIdentifier( entity, id, version, 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.