Package org.hibernate.engine.spi

Examples of org.hibernate.engine.spi.PersistenceContext


        // this class has no proxies (so do a shortcut)
        if (!persister.hasProxy()) {
      return load(event, persister, keyToLoad, options);
    }

        final PersistenceContext persistenceContext = event.getSession().getPersistenceContext();

    // look for a proxy
        Object proxy = persistenceContext.getProxy(keyToLoad);
        if (proxy != null) {
      return returnNarrowedProxy(event, persister, keyToLoad, options, persistenceContext, proxy);
    }

        if (options.isAllowProxyCreation()) {
View Full Code Here


        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,
        ( isReadOnly ? Status.READ_ONLY : Status.MANAGED ),
        values,
        null,
        entityId,
        version,
        LockMode.NONE,
        true,
        subclassPersister,
        false,
        entry.areLazyPropertiesUnfetched()
    );
    subclassPersister.afterInitialize( entity, entry.areLazyPropertiesUnfetched(), session );
    persistenceContext.initializeNonLazyCollections();

    //PostLoad is needed for EJB3
    PostLoadEvent postLoadEvent = new PostLoadEvent( session )
        .setEntity( entity )
        .setId( entityId )
View Full Code Here

    );

    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
        isReadOnly = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer().isReadOnly();
      }
    }
    else {
      isReadOnly = true;
    }
    persistenceContext.addEntry(
        result,
        ( isReadOnly ? Status.READ_ONLY : Status.MANAGED ),
        values,
        null,
        id,
        version,
        LockMode.NONE,
        true,
        subclassPersister,
        false,
        entry.areLazyPropertiesUnfetched()
    );
    subclassPersister.afterInitialize( result, entry.areLazyPropertiesUnfetched(), session );
    persistenceContext.initializeNonLazyCollections();
    // upgrade the lock if necessary:
    //lock(result, lockMode);

    //PostLoad is needed for EJB3
    //TODO: reuse the PostLoadEvent...
View Full Code Here

      final Object id = mappedIdentifierType.instantiate( entityMode );
      final Object[] propertyValues = virtualIdComponent.getPropertyValues( entity, entityMode );
      final Type[] subTypes = virtualIdComponent.getSubtypes();
      final Type[] copierSubTypes = mappedIdentifierType.getSubtypes();
      final Iterable<PersistEventListener> persistEventListeners = persistEventListeners( session );
      final PersistenceContext persistenceContext = session.getPersistenceContext();
      final int length = subTypes.length;
      for ( int i = 0 ; i < length; i++ ) {
        if ( propertyValues[i] == null ) {
          throw new HibernateException( "No part of a composite identifier may be null" );
        }
        //JPA 2 @MapsId + @IdClass points to the pk of the entity
        if ( subTypes[i].isAssociationType() && ! copierSubTypes[i].isAssociationType() ) {
          // we need a session to handle this use case
          if ( session == null ) {
            throw new AssertionError(
                "Deprecated version of getIdentifier (no session) was used but session was required"
            );
          }
          final Object subId;
          if ( HibernateProxy.class.isInstance( propertyValues[i] ) ) {
            subId = ( (HibernateProxy) propertyValues[i] ).getHibernateLazyInitializer().getIdentifier();
          }
          else {
            EntityEntry pcEntry = session.getPersistenceContext().getEntry( propertyValues[i] );
            if ( pcEntry != null ) {
              subId = pcEntry.getId();
            }
            else {
              LOG.debug( "Performing implicit derived identity cascade" );
              final PersistEvent event = new PersistEvent( null, propertyValues[i], (EventSource) session );
              for ( PersistEventListener listener : persistEventListeners ) {
                listener.onPersist( event );
              }
              pcEntry = persistenceContext.getEntry( propertyValues[i] );
              if ( pcEntry == null || pcEntry.getId() == null ) {
                throw new HibernateException( "Unable to process implicit derived identity cascade" );
              }
              else {
                subId = pcEntry.getId();
View Full Code Here

    }

    public void setIdentifier(Object entity, Serializable id, EntityMode entityMode, SessionImplementor session) {
      final Object[] extractedValues = mappedIdentifierType.getPropertyValues( id, entityMode );
      final Object[] injectionValues = new Object[ extractedValues.length ];
      final PersistenceContext persistenceContext = session.getPersistenceContext();
      for ( int i = 0; i < virtualIdComponent.getSubtypes().length; i++ ) {
        final Type virtualPropertyType = virtualIdComponent.getSubtypes()[i];
        final Type idClassPropertyType = mappedIdentifierType.getSubtypes()[i];
        if ( virtualPropertyType.isEntityType() && ! idClassPropertyType.isEntityType() ) {
          if ( session == null ) {
            throw new AssertionError(
                "Deprecated version of getIdentifier (no session) was used but session was required"
            );
          }
          final String associatedEntityName = ( (EntityType) virtualPropertyType ).getAssociatedEntityName();
          final EntityKey entityKey = session.generateEntityKey(
              (Serializable) extractedValues[i],
              session.getFactory().getEntityPersister( associatedEntityName )
          );
          // it is conceivable there is a proxy, so check that first
          Object association = persistenceContext.getProxy( entityKey );
          if ( association == null ) {
            // otherwise look for an initialized version
            association = persistenceContext.getEntity( entityKey );
          }
          injectionValues[i] = association;
        }
        else {
          injectionValues[i] = extractedValues[i];
View Full Code Here

          collectionPersister().getKeyColumnNames(),
          getFactory().getDialect()
      );

      try {
        final PersistenceContext persistenceContext = session.getPersistenceContext();
        boolean defaultReadOnlyOrig = persistenceContext.isDefaultReadOnly();
        if ( queryParameters.isReadOnlyInitialized() ) {
          // The read-only/modifiable mode for the query was explicitly set.
          // Temporarily set the default read-only/modifiable setting to the query's setting.
          persistenceContext.setDefaultReadOnly( queryParameters.isReadOnly() );
        }
        else {
          // The read-only/modifiable setting for the query was not initialized.
          // Use the default read-only/modifiable from the persistence context instead.
          queryParameters.setReadOnly( persistenceContext.isDefaultReadOnly() );
        }
        persistenceContext.beforeLoad();
        try {
          try {
            doTheLoad( sql, queryParameters, session );
          }
          finally {
            persistenceContext.afterLoad();
          }
          persistenceContext.initializeNonLazyCollections();
        }
        finally {
          // Restore the original default
          persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );
        }
      }
      catch ( SQLException e ) {
        throw getFactory().getSQLExceptionHelper().convert(
            e,
View Full Code Here

      final Object entity,
      final boolean readOnly,
      final SessionImplementor session,
      final PreLoadEvent preLoadEvent,
      final PostLoadEvent postLoadEvent) throws HibernateException {
    final PersistenceContext persistenceContext = session.getPersistenceContext();
    final EntityEntry entityEntry = persistenceContext.getEntry(entity);
    if ( entityEntry == null ) {
      throw new AssertionFailure( "possible non-threadsafe access to the session" );
    }
    final EntityPersister persister = entityEntry.getPersister();
    final Serializable id = entityEntry.getId();
View Full Code Here

      final EntityEntry entityEntry,
      final boolean readOnly,
      final SessionImplementor session,
      final PreLoadEvent preLoadEvent,
      final PostLoadEvent postLoadEvent) throws HibernateException {
    final PersistenceContext persistenceContext = session.getPersistenceContext();
    EntityPersister persister = entityEntry.getPersister();
    Serializable id = entityEntry.getId();
    Object[] hydratedState = entityEntry.getLoadedState();

    final boolean debugEnabled = LOG.isDebugEnabled();
    if ( debugEnabled ) {
      LOG.debugf(
          "Resolving associations for %s",
          MessageHelper.infoString( persister, id, session.getFactory() )
      );
    }

    Type[] types = persister.getPropertyTypes();
    for ( int i = 0; i < hydratedState.length; i++ ) {
      final Object value = hydratedState[i];
      if ( value!=LazyPropertyInitializer.UNFETCHED_PROPERTY && value!=BackrefPropertyAccessor.UNKNOWN ) {
        hydratedState[i] = types[i].resolve( value, session, entity );
      }
    }

    //Must occur after resolving identifiers!
    if ( session.isEventSource() ) {
      preLoadEvent.setEntity( entity ).setState( hydratedState ).setId( id ).setPersister( persister );

      final EventListenerGroup<PreLoadEventListener> listenerGroup = session
          .getFactory()
          .getServiceRegistry()
          .getService( EventListenerRegistry.class )
          .getEventListenerGroup( EventType.PRE_LOAD );
      for ( PreLoadEventListener listener : listenerGroup.listeners() ) {
        listener.onPreLoad( preLoadEvent );
      }
    }

    persister.setPropertyValues( entity, hydratedState );

    final SessionFactoryImplementor factory = session.getFactory();
    if ( persister.hasCache() && session.getCacheMode().isPutEnabled() ) {

      if ( debugEnabled ) {
        LOG.debugf(
            "Adding entity to second-level cache: %s",
            MessageHelper.infoString( persister, id, session.getFactory() )
        );
      }

      Object version = Versioning.getVersion(hydratedState, persister);
      CacheEntry entry = persister.buildCacheEntry( entity, hydratedState, version, session );
      CacheKey cacheKey = session.generateCacheKey( id, persister.getIdentifierType(), persister.getRootEntityName() );

      // explicit handling of caching for rows just inserted and then somehow forced to be read
      // from the database *within the same transaction*.  usually this is done by
      //     1) Session#refresh, or
      //     2) Session#clear + some form of load
      //
      // we need to be careful not to clobber the lock here in the cache so that it can be rolled back if need be
      if ( session.getPersistenceContext().wasInsertedDuringTransaction( persister, id ) ) {
        persister.getCacheAccessStrategy().update(
            cacheKey,
            persister.getCacheEntryStructure().structure( entry ),
            version,
            version
        );
      }
      else {
        try {
          session.getEventListenerManager().cachePutStart();
          final boolean put = persister.getCacheAccessStrategy().putFromLoad(
              cacheKey,
              persister.getCacheEntryStructure().structure( entry ),
              session.getTimestamp(),
              version,
              useMinimalPuts( session, entityEntry )
          );

          if ( put && factory.getStatistics().isStatisticsEnabled() ) {
            factory.getStatisticsImplementor().secondLevelCachePut( persister.getCacheAccessStrategy().getRegion().getName() );
          }
        }
        finally {
          session.getEventListenerManager().cachePutEnd();
        }
      }
    }

    if ( persister.hasNaturalIdentifier() ) {
      persistenceContext.getNaturalIdHelper().cacheNaturalIdCrossReferenceFromLoad(
          persister,
          id,
          persistenceContext.getNaturalIdHelper().extractNaturalIdValues( hydratedState, persister )
      );
    }

    boolean isReallyReadOnly = readOnly;
    if ( !persister.isMutable() ) {
      isReallyReadOnly = true;
    }
    else {
      Object proxy = persistenceContext.getProxy( entityEntry.getEntityKey() );
      if ( proxy != null ) {
        // there is already a proxy for this impl
        // only set the status to read-only if the proxy is read-only
        isReallyReadOnly = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer().isReadOnly();
      }
    }
    if ( isReallyReadOnly ) {
      //no need to take a snapshot - this is a
      //performance optimization, but not really
      //important, except for entities with huge
      //mutable property values
      persistenceContext.setEntryStatus(entityEntry, Status.READ_ONLY);
    }
    else {
      //take a snapshot
      TypeHelper.deepCopy(
          hydratedState,
          persister.getPropertyTypes(),
          persister.getPropertyUpdateability(),
          hydratedState,  //after setting values to object, entityMode
          session
      );
      persistenceContext.setEntryStatus(entityEntry, Status.MANAGED);
    }

    persister.afterInitialize(
        entity,
        entityEntry.isLoadedWithLazyPropertiesUnfetched(),
View Full Code Here

    LOG.trace( "Flushing session" );

    EventSource session = event.getSession();

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

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

    persistenceContext.setFlushing( true );
    try {
      int entityCount = flushEntities( event, persistenceContext );
      int collectionCount = flushCollections( session, persistenceContext );

      event.setNumberOfEntitiesProcessed( entityCount );
      event.setNumberOfCollectionsProcessed( collectionCount );
    }
    finally {
      persistenceContext.setFlushing(false);
    }

    //some statistics
    logFlushResults( event );
  }
View Full Code Here

  private void logFlushResults(FlushEvent event) {
    if ( !LOG.isDebugEnabled() ) {
      return;
    }
    final EventSource session = event.getSession();
    final PersistenceContext persistenceContext = session.getPersistenceContext();
    LOG.debugf(
        "Flushed: %s insertions, %s updates, %s deletions to %s objects",
        session.getActionQueue().numberOfInsertions(),
        session.getActionQueue().numberOfUpdates(),
        session.getActionQueue().numberOfDeletions(),
        persistenceContext.getNumberOfManagedEntities()
    );
    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().entrySet()
    );
  }
View Full Code Here

TOP

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

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.