FileDocCategorySizeDatePackage
BatchingCollectionInitializer.javaAPI DocHibernate 3.2.53453Mon Jun 13 15:10:20 BST 2005org.hibernate.loader.collection

BatchingCollectionInitializer

public class BatchingCollectionInitializer extends Object implements CollectionInitializer
"Batch" loads collections, using multiple foreign key values in the SQL where clause.
see
BasicCollectionLoader
see
OneToManyLoader
author
Gavin King

Fields Summary
private final org.hibernate.loader.Loader[]
loaders
private final int[]
batchSizes
private final org.hibernate.persister.collection.CollectionPersister
collectionPersister
Constructors Summary
public BatchingCollectionInitializer(org.hibernate.persister.collection.CollectionPersister collPersister, int[] batchSizes, org.hibernate.loader.Loader[] loaders)

		this.loaders = loaders;
		this.batchSizes = batchSizes;
		this.collectionPersister = collPersister;
	
Methods Summary
public static CollectionInitializercreateBatchingCollectionInitializer(org.hibernate.persister.collection.QueryableCollection persister, int maxBatchSize, org.hibernate.engine.SessionFactoryImplementor factory, java.util.Map enabledFilters)


		if ( maxBatchSize>1 ) {
			int[] batchSizesToCreate = ArrayHelper.getBatchSizes(maxBatchSize);
			Loader[] loadersToCreate = new Loader[ batchSizesToCreate.length ];
			for ( int i=0; i<batchSizesToCreate.length; i++ ) {
				loadersToCreate[i] = new BasicCollectionLoader(persister, batchSizesToCreate[i], factory, enabledFilters);
			}
			return new BatchingCollectionInitializer(persister, batchSizesToCreate, loadersToCreate);
		}
		else {
			return new BasicCollectionLoader(persister, factory, enabledFilters);
		}
	
public static CollectionInitializercreateBatchingOneToManyInitializer(org.hibernate.persister.collection.QueryableCollection persister, int maxBatchSize, org.hibernate.engine.SessionFactoryImplementor factory, java.util.Map enabledFilters)


		if ( maxBatchSize>1 ) {
			int[] batchSizesToCreate = ArrayHelper.getBatchSizes(maxBatchSize);
			Loader[] loadersToCreate = new Loader[ batchSizesToCreate.length ];
			for ( int i=0; i<batchSizesToCreate.length; i++ ) {
				loadersToCreate[i] = new OneToManyLoader(persister, batchSizesToCreate[i], factory, enabledFilters);
			}
			return new BatchingCollectionInitializer(persister, batchSizesToCreate, loadersToCreate);
		}
		else {
			return new OneToManyLoader(persister, factory, enabledFilters);
		}
	
public voidinitialize(java.io.Serializable id, org.hibernate.engine.SessionImplementor session)

		
		Serializable[] batch = session.getPersistenceContext().getBatchFetchQueue()
			.getCollectionBatch( collectionPersister, id, batchSizes[0], session.getEntityMode() );
		
		for ( int i=0; i<batchSizes.length-1; i++) {
			final int smallBatchSize = batchSizes[i];
			if ( batch[smallBatchSize-1]!=null ) {
				Serializable[] smallBatch = new Serializable[smallBatchSize];
				System.arraycopy(batch, 0, smallBatch, 0, smallBatchSize);
				loaders[i].loadCollectionBatch( session, smallBatch, collectionPersister.getKeyType() );
				return; //EARLY EXIT!
			}
		}
		
		loaders[batchSizes.length-1].loadCollection( session, id, collectionPersister.getKeyType() );