onetomanyloader.java

来自「hibernate-3.0.5 中文文档」· Java 代码 · 共 173 行

JAVA
173
字号
//$Id: OneToManyLoader.java,v 1.9 2005/05/19 07:28:57 steveebersole Exp $package org.hibernate.loader.collection;import java.io.Serializable;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.hibernate.HibernateException;import org.hibernate.LockMode;import org.hibernate.MappingException;import org.hibernate.engine.SessionFactoryImplementor;import org.hibernate.engine.SessionImplementor;import org.hibernate.loader.OuterJoinLoader;import org.hibernate.loader.OuterJoinableAssociation;import org.hibernate.persister.collection.QueryableCollection;import org.hibernate.persister.entity.OuterJoinLoadable;import org.hibernate.sql.JoinFragment;import org.hibernate.sql.Select;import org.hibernate.type.Type;import org.hibernate.util.CollectionHelper;import org.hibernate.util.StringHelper;/** * Loads one-to-many associations<br> * <br> * The collection persister must implement <tt>QueryableCOllection<tt>. For * other collections, create a customized subclass of <tt>Loader</tt>. * * @see CollectionLoader * @author Gavin King */public class OneToManyLoader extends OuterJoinLoader implements CollectionInitializer {	private static final Log log = LogFactory.getLog(OneToManyLoader.class);	private final QueryableCollection oneToManyPersister;	protected boolean isDuplicateAssociation(		final Set visitedAssociationKeys, 		final String foreignKeyTable, 		final String[] foreignKeyColumns	) {		//disable a join back to this same association		final boolean isSameJoin = oneToManyPersister.getTableName().equals(foreignKeyTable) &&			Arrays.equals( foreignKeyColumns, oneToManyPersister.getKeyColumnNames() );		return isSameJoin || 			super.isDuplicateAssociation(visitedAssociationKeys, foreignKeyTable, foreignKeyColumns);	}	public OneToManyLoader(			QueryableCollection oneToManyPersister, 			SessionFactoryImplementor session, 			Map enabledFilters)	throws MappingException {		this(oneToManyPersister, 1, session, enabledFilters);	}	public OneToManyLoader(			QueryableCollection oneToManyPersister, 			int batchSize, 			SessionFactoryImplementor factory, 			Map enabledFilters)	throws MappingException {		this(oneToManyPersister, batchSize, null, factory, enabledFilters);	}	public OneToManyLoader(			QueryableCollection oneToManyPersister, 			int batchSize, 			String subquery, 			SessionFactoryImplementor factory, 			Map enabledFilters)	throws MappingException {		super(factory, enabledFilters);		this.oneToManyPersister = oneToManyPersister;		final OuterJoinLoadable elementPersister = (OuterJoinLoadable) oneToManyPersister.getElementPersister();		final String alias = generateRootAlias( oneToManyPersister.getRole() );		final List associations = walkEntityTree(elementPersister, alias);		List allAssociations = new ArrayList();		allAssociations.addAll(associations);		allAssociations.add( new OuterJoinableAssociation( 				oneToManyPersister.getCollectionType(),				null, 				null, 				alias, 				JoinFragment.LEFT_OUTER_JOIN, 				getFactory(), 				CollectionHelper.EMPTY_MAP 			) );				initPersisters(allAssociations, LockMode.NONE);		initStatementString(elementPersister, alias, associations, batchSize, subquery);		postInstantiate();		log.debug( "Static select for one-to-many " + oneToManyPersister.getRole() + ": " + getSQLString() );	}	public void initialize(Serializable id, SessionImplementor session)	throws HibernateException {		loadCollection( session, id, getKeyType() );	}	private void initStatementString(		final OuterJoinLoadable elementPersister,		final String alias,		final List associations,		final int batchSize,		final String subquery)	throws MappingException {		final int joins = countEntityPersisters( associations );		suffixes = generateSuffixes( joins + 1 );		final int collectionJoins = countCollectionPersisters( associations ) + 1;		collectionSuffixes = generateSuffixes( joins + 1, collectionJoins );		StringBuffer whereString = whereString(				alias, oneToManyPersister.getKeyColumnNames(), batchSize, subquery		);		String filter = oneToManyPersister.filterFragment( alias, getEnabledFilters() );		whereString.insert( 0, StringHelper.moveAndToBeginning(filter) );		JoinFragment ojf = mergeOuterJoins(associations);		Select select = new Select( getDialect() )			.setSelectClause(				oneToManyPersister.selectFragment(null, null, alias, suffixes[joins], collectionSuffixes[0], true) +				selectString(associations)			)			.setFromClause(				elementPersister.fromTableFragment(alias) +				elementPersister.fromJoinFragment(alias, true, true)			)			.setWhereClause( whereString.toString() )			.setOuterJoins(				ojf.toFromFragmentString(),				ojf.toWhereFragmentString() +				elementPersister.whereJoinFragment(alias, true, true)			);		select.setOrderByClause( orderBy( associations, oneToManyPersister.getSQLOrderByString(alias) ) );		if ( getFactory().getSettings().isCommentsEnabled() ) {			select.setComment( "load one-to-many " + oneToManyPersister.getRole() );		}		sql = select.toStatementString();	}	protected Type getKeyType() {		return oneToManyPersister.getKeyType();	}	public String toString() {		return getClass().getName() + '(' + oneToManyPersister.getRole() + ')';	}	protected boolean isSubselectLoadingEnabled() {		return hasSubselectLoadableCollections();	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?