Package org.hibernate.engine.spi

Examples of org.hibernate.engine.spi.SessionImplementor


    MongoDBProcessingChain processingChain = createProcessingChain( session, unwrap( namedParameters ) );

    MongoDBQueryParsingResult result = queryParser.parseQuery( queryString, processingChain );
    log.createdQuery( queryString, result );

    SessionImplementor sessionImplementor = (SessionImplementor) session;

    String tableName = ( (OgmEntityPersister) ( sessionImplementor
        .getFactory() )
        .getEntityPersister( result.getEntityType().getName() ) )
        .getTableName();

    NoSQLQuery query = new NoSQLQueryImpl(
View Full Code Here


      if (logger.isDebugEnabled()) {
        logger.debug("First-level parse tree for " + namedQuery.name() + ":");
        parser.showAst(hqlAst, System.out);
      }

      SessionImplementor hibernateSession = em.unwrap(SessionImplementor.class);
      ASTQueryTranslatorFactory translatorFactory = new ASTQueryTranslatorFactory();
      query = (QueryTranslatorImpl) translatorFactory.createQueryTranslator(
              namedQuery.name(), jpaQuery, java.util.Collections.EMPTY_MAP, hibernateSession.getFactory());

      query.compile(Collections.EMPTY_MAP, false);

      if (query.getReturnTypes().length != 1) {
        throw new RuntimeException(
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
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 = null;
                    @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);
          if ( databaseSnapshot != null ) {
            dirtyProperties = persister.findModified(databaseSnapshot, values, entity, session);
            cannotDirtyCheck = false;
            event.setDatabaseSnapshot(databaseSnapshot);
          }
        }
      }
      finally {
        session.getEventListenerManager().dirtyCalculationEnd( dirtyProperties != null );
      }
    }
    else {
      // the Interceptor handled the dirty checking
      cannotDirtyCheck = false;
View Full Code Here

   * @param event The load event to be handled.
   * @throws HibernateException
   */
  public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType) throws HibernateException {

    final SessionImplementor source = event.getSession();

    EntityPersister persister;
    if ( event.getInstanceToLoad() != null ) {
      persister = source.getEntityPersister( null, event.getInstanceToLoad() ); //the load() which takes an entity does not pass an entityName
      event.setEntityClassName( event.getInstanceToLoad().getClass().getName() );
    }
    else {
      persister = source.getFactory().getEntityPersister( event.getEntityClassName() );
    }

    if ( persister == null ) {
      throw new HibernateException(
          "Unable to locate persister: " +
          event.getEntityClassName()
        );
    }

    final Class idClass = persister.getIdentifierType().getReturnedClass();
    if ( idClass != null && ! idClass.isInstance( event.getEntityId() ) ) {
      // we may have the kooky jpa requirement of allowing find-by-id where
      // "id" is the "simple pk value" of a dependent objects parent.  This
      // is part of its generally goofy "derived identity" "feature"
      if ( persister.getEntityMetamodel().getIdentifierProperty().isEmbedded() ) {
        final EmbeddedComponentType dependentIdType =
            (EmbeddedComponentType) persister.getEntityMetamodel().getIdentifierProperty().getType();
        if ( dependentIdType.getSubtypes().length == 1 ) {
          final Type singleSubType = dependentIdType.getSubtypes()[0];
          if ( singleSubType.isEntityType() ) {
            final EntityType dependentParentType = (EntityType) singleSubType;
            final Type dependentParentIdType = dependentParentType.getIdentifierOrUniqueKeyType( source.getFactory() );
            if ( dependentParentIdType.getReturnedClass().isInstance( event.getEntityId() ) ) {
              // yep that's what we have...
              loadByDerivedIdentitySimplePkValue(
                  event,
                  loadType,
                  persister,
                  dependentIdType,
                  source.getFactory().getEntityPersister( dependentParentType.getAssociatedEntityName() )
              );
              return;
            }
          }
        }
      }
      throw new TypeMismatchException(
          "Provided id of the wrong type for class " + persister.getEntityName() + ". Expected: " + idClass + ", got " + event.getEntityId().getClass()
      );
    }

    final  EntityKey keyToLoad = source.generateEntityKey( event.getEntityId(), persister );

    try {
      if ( loadType.isNakedEntityReturned() ) {
        //do not return a proxy!
        //(this option indicates we are initializing a proxy)
View Full Code Here

  protected Object loadFromDatasource(
      final LoadEvent event,
      final EntityPersister persister,
      final EntityKey keyToLoad,
      final LoadEventListener.LoadType options) {
    final SessionImplementor source = event.getSession();
    Object entity = persister.load(
        event.getEntityId(),
        event.getInstanceToLoad(),
        event.getLockOptions(),
        source
    );
   
    if ( event.isAssociationFetch() && source.getFactory().getStatistics().isStatisticsEnabled() ) {
      source.getFactory().getStatisticsImplementor().fetchEntity( event.getEntityClassName() );
    }

    return entity;
  }
View Full Code Here

  protected Object loadFromSessionCache(
      final LoadEvent event,
      final EntityKey keyToLoad,
      final LoadEventListener.LoadType options) throws HibernateException {

    SessionImplementor session = event.getSession();
    Object old = session.getEntityUsingInterceptor( keyToLoad );

    if ( old != null ) {
      // this object was already loaded
      EntityEntry oldEntry = session.getPersistenceContext().getEntry( old );
      if ( options.isCheckDeleted() ) {
        Status status = oldEntry.getStatus();
        if ( status == Status.DELETED || status == Status.GONE ) {
          return REMOVED_ENTITY_MARKER;
        }
View Full Code Here

  protected Object loadFromSecondLevelCache(
      final LoadEvent event,
      final EntityPersister persister,
      final LoadEventListener.LoadType options) {

    final SessionImplementor source = event.getSession();
    final boolean useCache = persister.hasCache()
        && source.getCacheMode().isGetEnabled()
        && event.getLockMode().lessThan(LockMode.READ);

    if ( ! useCache ) {
      // we can't use cache here
      return null;
    }

    final SessionFactoryImplementor factory = source.getFactory();
    final CacheKey ck = source.generateCacheKey(
        event.getEntityId(),
        persister.getIdentifierType(),
        persister.getRootEntityName()
    );
View Full Code Here

    super( session, key, owner );
  }

  Object processCollection(Object collection, CollectionType type) throws HibernateException {

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

    if ( collection == null ) {
      //do nothing
    }
    else if ( collection instanceof PersistentCollection ) {
View Full Code Here

    if ( event.getLockMode() == LockMode.WRITE ) {
      throw new HibernateException( "Invalid lock mode for lock()" );
    }

    SessionImplementor source = event.getSession();
   
    Object entity = source.getPersistenceContext().unproxyAndReassociate( event.getObject() );
    //TODO: if object was an uninitialized proxy, this is inefficient,
    //      resulting in two SQL selects
   
    EntityEntry entry = source.getPersistenceContext().getEntry(entity);
    if (entry==null) {
      final EntityPersister persister = source.getEntityPersister( event.getEntityName(), entity );
      final Serializable id = persister.getIdentifier( entity, source );
      if ( !ForeignKeys.isNotTransient( event.getEntityName(), entity, Boolean.FALSE, source ) ) {
        throw new TransientObjectException(
            "cannot lock an unsaved transient instance: " +
            persister.getEntityName()
View Full Code Here

TOP

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

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.