docs: private void initializeEntitiesAndCollections(
  			final List hydratedObjects,
  			final ResultSet resultSetId,
  			final SharedSessionContractImplementor session,
  			final boolean readOnly)
  	throws HibernateException {
  
  		final CollectionPersister[] collectionPersisters = getCollectionPersisters();
  		if ( collectionPersisters != null ) {
  			for ( int i = 0; i < collectionPersisters.length; i++ ) {
  				if ( collectionPersisters[i].isArray() ) {
  					//for arrays, we should end the collection load before resolving
  					//the entities, since the actual array instances are not instantiated
  					//during loading
  					//TODO: or we could do this polymorphically, and have two
  					//      different operations implemented differently for arrays
  					endCollectionLoad( resultSetId, session, collectionPersisters[i] );
  				}
  			}
  		}
  
  		//important: reuse the same event instances for performance!
  		final PreLoadEvent pre;
  		final PostLoadEvent post;
  		if ( session.isEventSource() ) {
  			pre = new PreLoadEvent( (EventSource) session );
  			post = new PostLoadEvent( (EventSource) session );
  		}
  		else {
  			pre = null;
  			post = null;
  		}
  
  		if ( hydratedObjects != null ) {
  			int hydratedObjectsSize = hydratedObjects.size();
  			if ( log.isTraceEnabled() ) {
  				log.trace( "total objects hydrated: " + hydratedObjectsSize );
  			}
  			for ( int i = 0; i < hydratedObjectsSize; i++ ) {
  				TwoPhaseLoad.initializeEntity( hydratedObjects.get( i ), readOnly, session, pre );
  			}
  		}
  
  		if ( collectionPersisters != null ) {
  			for ( int i = 0; i < collectionPersisters.length; i++ ) {
  				if ( !collectionPersisters[i].isArray() ) {
  					//for sets, we should end the collection load after resolving
  					//the entities, since we might call hashCode() on the elements
  					//TODO: or we could do this polymorphically, and have two
  					//      different operations implemented differently for arrays
  					endCollectionLoad( resultSetId, session, collectionPersisters[i] );
  				}
  			}
  		}
  
  		if ( hydratedObjects != null ) {
  			for ( Object hydratedObject : hydratedObjects ) {
  				TwoPhaseLoad.postLoad( hydratedObject, session, post );
  			}
  		}
  	}