Package org.hibernate.event.spi

Examples of org.hibernate.event.spi.EventSource


   */
  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


    if ( traceEnabled ) {
      LOG.tracev( "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) {
    EventSource source = event.getSession();
    source.getPersistenceContext().incrementCascadeLevel();
    try {
      new Cascade( CascadingAction.SAVE_UPDATE, Cascade.AFTER_UPDATE, source )
          .cascade( persister, entity );
    }
    finally {
      source.getPersistenceContext().decrementCascadeLevel();
    }
  }
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 HibernateException( "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( CascadingAction.REFRESH, Cascade.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

    if ( !lockable.isVersioned() ) {
      throw new HibernateException( "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
    }
    EntityEntry entry = session.getPersistenceContext().getEntry( object );
    EntityIncrementVersionProcess incrementVersion = new EntityIncrementVersionProcess( object, entry );
    EventSource source = (EventSource) session;
    // Register the EntityIncrementVersionProcess action to run just prior to transaction commit.
    source.getActionQueue().registerProcess( incrementVersion );
  }
View Full Code Here

  public void lock(Serializable id, Object version, Object object, int timeout, SessionImplementor session) {
    if ( !lockable.isVersioned() ) {
      throw new OptimisticLockException( object, "[" + lockMode + "] not supported for non-versioned entities [" + lockable.getEntityName() + "]" );
    }
    EntityEntry entry = session.getPersistenceContext().getEntry(object);
    EventSource source = (EventSource)session;
    EntityVerifyVersionProcess verifyVersion = new EntityVerifyVersionProcess(object, entry);
    // Register the EntityVerifyVersionProcess action to run just prior to transaction commit.
    source.getActionQueue().registerProcess(verifyVersion);
  }
View Full Code Here

  }

  private static TransactionManager lookupTransactionManager(SessionFactoryImplementor sessionFactory) {
    final Session session = sessionFactory.openSession();
    try {
      EventSource eventSource = (EventSource)session;
      return eventSource
        .getTransactionCoordinator()
        .getTransactionContext()
        .getTransactionEnvironment()
        .getJtaPlatform()
        .retrieveTransactionManager();
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

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.