/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.loader.entity.impl; import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.loader.entity.UniqueEntityLoader; import org.hibernate.ogm.loader.impl.TupleBasedEntityLoader; import org.hibernate.persister.entity.OuterJoinLoadable; /** * DO NOT CHANGE: this class is copied from ORM 5 and changes will be backported at some point * * The contract for building {@link UniqueEntityLoader} capable of performing batch-fetch loading. Intention * is to build these instances, by first calling the static {@link #getBuilder}, and then calling the appropriate * {@link #buildLoader} method. * * @author Steve Ebersole * @author Emmanuel Bernard * * @see org.hibernate.loader.BatchFetchStyle */ public abstract class BatchingEntityLoaderBuilder { // FIXME: Transform this method into a service initiator and have BatchingEntityLoader be a Service when migrating back to ORM public static BatchingEntityLoaderBuilder getBuilder(SessionFactoryImplementor factory) { // Today, the MultigetGridDialect interface does not offer support for prepared statement / fixed size abtch queries // Better use the dynamic batching in all cases until further notice // TODO should we raise an info on ignoring this setting // I don't see it being used much in practice and will probably annoy more than help return DynamicBatchingEntityLoaderBuilder.INSTANCE; // Unused implementation PaddedBatchingEntityLoaderBuilder.INSTANCE; // but will be gone when we migrate the code back to ORM } /** * Contract abstracting how the inner entity loader is build. * Allow to inject the OGM one instead of the ORM one for example. * * @author Emmanuel Bernard */ public interface BatchableEntityLoaderBuilder { /** * Builds a single entity loader for that set of parameters. * Abstract away the various UniqueEntityLoader implementations that ORM or OGM might use. */ <L extends BatchableEntityLoader & TupleBasedEntityLoader> L buildLoader(OuterJoinLoadable persister, int batchSize, LockMode lockMode, SessionFactoryImplementor factory, LoadQueryInfluencers influencers); /** * Builds a single entity loader for that set of parameters. * Abstract away the various UniqueEntityLoader implementations that ORM or OGM might use. */ <L extends BatchableEntityLoader & TupleBasedEntityLoader> L buildLoader(OuterJoinLoadable persister, int batchSize, LockOptions lockOptions, SessionFactoryImplementor factory, LoadQueryInfluencers influencers); /** * Builds a single entity loader for that set of parameters. * The loader accept a non fixed sized batch load (dynamic loader). * Abstract away the various UniqueEntityLoader implementations that ORM or OGM might use. */ BatchableEntityLoader buildDynamicLoader(OuterJoinLoadable persister, int batchSize, LockMode lockMode, SessionFactoryImplementor factory, LoadQueryInfluencers influencers); /** * Builds a single entity loader for that set of parameters. * The loader accept a non fixed sized batch load (dynamic loader). * Abstract away the various UniqueEntityLoader implementations that ORM or OGM might use. */ BatchableEntityLoader buildDynamicLoader(OuterJoinLoadable persister, int batchSize, LockOptions lockOptions, SessionFactoryImplementor factory, LoadQueryInfluencers influencers); } /** * Builds a batch-fetch capable loader based on the given persister, lock-mode, etc. * * @param persister The entity persister * @param batchSize The maximum number of ids to batch-fetch at once * @param lockMode The lock mode * @param factory The SessionFactory * @param influencers Any influencers that should affect the built query * @param innerEntityLoaderBuilder Builder of the entity loader receiving the subset of batches * * @return The loader. */ public UniqueEntityLoader buildLoader( OuterJoinLoadable persister, int batchSize, LockMode lockMode, SessionFactoryImplementor factory, LoadQueryInfluencers influencers, BatchableEntityLoaderBuilder innerEntityLoaderBuilder) { if ( batchSize <= 1 ) { // no batching return buildNonBatchingLoader( persister, lockMode, factory, influencers, innerEntityLoaderBuilder ); } return buildBatchingLoader( persister, batchSize, lockMode, factory, influencers, innerEntityLoaderBuilder ); } public UniqueEntityLoader buildLoader( OuterJoinLoadable persister, int batchSize, LockMode lockMode, SessionFactoryImplementor factory, LoadQueryInfluencers influencers) { return buildLoader( persister, batchSize, lockMode, factory, influencers, null ); } protected UniqueEntityLoader buildNonBatchingLoader( OuterJoinLoadable persister, LockMode lockMode, SessionFactoryImplementor factory, LoadQueryInfluencers influencers, BatchableEntityLoaderBuilder innerEntityLoaderBuilder) { return innerEntityLoaderBuilder.buildLoader( persister, 1, lockMode, factory, influencers ); } protected abstract UniqueEntityLoader buildBatchingLoader( OuterJoinLoadable persister, int batchSize, LockMode lockMode, SessionFactoryImplementor factory, LoadQueryInfluencers influencers, BatchableEntityLoaderBuilder innerEntityLoaderBuilder); /** * Builds a batch-fetch capable loader based on the given persister, lock-options, etc. * * @param persister The entity persister * @param batchSize The maximum number of ids to batch-fetch at once * @param lockOptions The lock options * @param factory The SessionFactory * @param influencers Any influencers that should affect the built query * @param innerEntityLoaderBuilder Builder of the entity loader receiving the subset of batches * * @return The loader. */ public UniqueEntityLoader buildLoader( OuterJoinLoadable persister, int batchSize, LockOptions lockOptions, SessionFactoryImplementor factory, LoadQueryInfluencers influencers, BatchableEntityLoaderBuilder innerEntityLoaderBuilder) { if ( batchSize <= 1 ) { // no batching return buildNonBatchingLoader( persister, lockOptions, factory, influencers, innerEntityLoaderBuilder ); } return buildBatchingLoader( persister, batchSize, lockOptions, factory, influencers, innerEntityLoaderBuilder ); } protected UniqueEntityLoader buildNonBatchingLoader( OuterJoinLoadable persister, LockOptions lockOptions, SessionFactoryImplementor factory, LoadQueryInfluencers influencers, BatchableEntityLoaderBuilder innerEntityLoaderBuilder) { return innerEntityLoaderBuilder.buildLoader( persister, 1, lockOptions, factory, influencers ); } protected abstract UniqueEntityLoader buildBatchingLoader( OuterJoinLoadable persister, int batchSize, LockOptions lockOptions, SessionFactoryImplementor factory, LoadQueryInfluencers influencers, BatchableEntityLoaderBuilder innerEntityLoaderBuilder); }