⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractentitypersister.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	}	protected String[] getSubclassFormulaTemplateClosure() {		return subclassFormulaTemplateClosure;	}	protected String[] getSubclassFormulaAliasClosure() {		return subclassFormulaAliasClosure;	}	public String[] getSubclassPropertyColumnAliases(String propertyName, String suffix) {		String rawAliases[] = ( String[] ) subclassPropertyAliases.get( propertyName );		if ( rawAliases == null ) {			return null;		}		String result[] = new String[rawAliases.length];		for ( int i = 0; i < rawAliases.length; i++ ) {			result[i] = new Alias( suffix ).toUnquotedAliasString( rawAliases[i] );		}		return result;	}	public String[] getSubclassPropertyColumnNames(String propertyName) {		//TODO: should we allow suffixes on these ?		return ( String[] ) subclassPropertyColumnNames.get( propertyName );	}	//This is really ugly, but necessary:	/**	 * Must be called by subclasses, at the end of their constructors	 */	protected void initSubclassPropertyAliasesMap(PersistentClass model) throws MappingException {		// ALIASES		internalInitSubclassPropertyAliasesMap( null, model.getSubclassPropertyClosureIterator() );		// aliases for identifier ( alias.id ); skip if the entity defines a non-id property named 'id'		if ( ! entityMetamodel.hasNonIdentifierPropertyNamedId() ) {			subclassPropertyAliases.put( ENTITY_ID, getIdentifierAliases() );			subclassPropertyColumnNames.put( ENTITY_ID, getIdentifierColumnNames() );		}		// aliases named identifier ( alias.idname )		if ( hasIdentifierProperty() ) {			subclassPropertyAliases.put( getIdentifierPropertyName(), getIdentifierAliases() );			subclassPropertyColumnNames.put( getIdentifierPropertyName(), getIdentifierColumnNames() );		}		// aliases for composite-id's		if ( getIdentifierType().isComponentType() ) {			// Fetch embedded identifiers propertynames from the "virtual" identifier component			AbstractComponentType componentId = ( AbstractComponentType ) getIdentifierType();			String[] idPropertyNames = componentId.getPropertyNames();			String[] idAliases = getIdentifierAliases();			String[] idColumnNames = getIdentifierColumnNames();			for ( int i = 0; i < idPropertyNames.length; i++ ) {				if ( entityMetamodel.hasNonIdentifierPropertyNamedId() ) {					subclassPropertyAliases.put(							ENTITY_ID + "." + idPropertyNames[i],							new String[] { idAliases[i] }					);					subclassPropertyColumnNames.put(							ENTITY_ID + "." + getIdentifierPropertyName() + "." + idPropertyNames[i],							new String[] { idColumnNames[i] }					);				}//				if (hasIdentifierProperty() && !ENTITY_ID.equals( getIdentifierPropertyName() ) ) {				if ( hasIdentifierProperty() ) {					subclassPropertyAliases.put(							getIdentifierPropertyName() + "." + idPropertyNames[i],							new String[] { idAliases[i] }					);					subclassPropertyColumnNames.put(							getIdentifierPropertyName() + "." + idPropertyNames[i],							new String[] { idColumnNames[i] }					);				}				else {					// embedded composite ids ( alias.idname1, alias.idname2 )					subclassPropertyAliases.put( idPropertyNames[i], new String[] { idAliases[i] } );					subclassPropertyColumnNames.put( idPropertyNames[i],  new String[] { idColumnNames[i] } );				}			}		}		if ( entityMetamodel.isPolymorphic() ) {			subclassPropertyAliases.put( ENTITY_CLASS, new String[] { getDiscriminatorAlias() } );			subclassPropertyColumnNames.put( ENTITY_CLASS, new String[] { getDiscriminatorColumnName() } );		}	}	private void internalInitSubclassPropertyAliasesMap(String path, Iterator propertyIterator) {		while ( propertyIterator.hasNext() ) {			Property prop = ( Property ) propertyIterator.next();			String propname = path == null ? prop.getName() : path + "." + prop.getName();			if ( prop.isComposite() ) {				Component component = ( Component ) prop.getValue();				Iterator compProps = component.getPropertyIterator();				internalInitSubclassPropertyAliasesMap( propname, compProps );			}			else {				String[] aliases = new String[prop.getColumnSpan()];				String[] cols = new String[prop.getColumnSpan()];				Iterator colIter = prop.getColumnIterator();				int l = 0;				while ( colIter.hasNext() ) {					Selectable thing = ( Selectable ) colIter.next();					aliases[l] = thing.getAlias( getFactory().getDialect(), prop.getValue().getTable() );					cols[l] = thing.getText( getFactory().getDialect() ); // TODO: skip formulas?					l++;				}				subclassPropertyAliases.put( propname, aliases );				subclassPropertyColumnNames.put( propname, cols );			}		}	}	public Object loadByUniqueKey(String propertyName, Object uniqueKey, SessionImplementor session)			throws HibernateException {		return getAppropriateUniqueKeyLoader( propertyName, session.getEnabledFilters() )				.loadByUniqueKey( session, uniqueKey );	}	private EntityLoader getAppropriateUniqueKeyLoader(String propertyName, Map enabledFilters) {		final boolean useStaticLoader = ( enabledFilters == null || enabledFilters.isEmpty() )				&& propertyName.indexOf('.')<0; //ugly little workaround for fact that createUniqueKeyLoaders() does not handle component properties		if ( useStaticLoader ) {			return (EntityLoader) uniqueKeyLoaders.get( propertyName );		}		else {			return createUniqueKeyLoader(					propertyMapping.toType(propertyName),					propertyMapping.toColumns(propertyName),					enabledFilters				);		}	}	public int getPropertyIndex(String propertyName) {		return entityMetamodel.getPropertyIndex(propertyName);	}	protected void createUniqueKeyLoaders() throws MappingException {		Type[] propertyTypes = getPropertyTypes();		String[] propertyNames = getPropertyNames();		for ( int i = 0; i < entityMetamodel.getPropertySpan(); i++ ) {			if ( propertyUniqueness[i] ) {				//don't need filters for the static loaders				uniqueKeyLoaders.put(						propertyNames[i],						createUniqueKeyLoader(								propertyTypes[i],								getPropertyColumnNames( i ),								CollectionHelper.EMPTY_MAP							)					);				//TODO: create uk loaders for component properties			}		}	}	private EntityLoader createUniqueKeyLoader(Type uniqueKeyType, String[] columns, Map enabledFilters) {		if ( uniqueKeyType.isEntityType() ) {			String className = ( ( EntityType ) uniqueKeyType ).getAssociatedEntityName();			uniqueKeyType = getFactory().getEntityPersister( className ).getIdentifierType();		}		return new EntityLoader( this, columns, uniqueKeyType, 1, LockMode.NONE, getFactory(), enabledFilters );	}	protected String getSQLWhereString(String alias) {		return StringHelper.replace( sqlWhereStringTemplate, Template.TEMPLATE, alias );	}	protected boolean hasWhere() {		return sqlWhereString != null;	}	private void initOrdinaryPropertyPaths(Mapping mapping) throws MappingException {		for ( int i = 0; i < getSubclassPropertyNameClosure().length; i++ ) {			propertyMapping.initPropertyPaths( getSubclassPropertyNameClosure()[i],					getSubclassPropertyTypeClosure()[i],					getSubclassPropertyColumnNameClosure()[i],					getSubclassPropertyFormulaTemplateClosure()[i],					mapping );		}	}	private void initIdentifierPropertyPaths(Mapping mapping) throws MappingException {		String idProp = getIdentifierPropertyName();		if ( idProp != null ) {			propertyMapping.initPropertyPaths( idProp, getIdentifierType(), getIdentifierColumnNames(), null, mapping );		}		if ( entityMetamodel.getIdentifierProperty().isEmbedded() ) {			propertyMapping.initPropertyPaths( null, getIdentifierType(), getIdentifierColumnNames(), null, mapping );		}		if ( ! entityMetamodel.hasNonIdentifierPropertyNamedId() ) {			propertyMapping.initPropertyPaths( ENTITY_ID, getIdentifierType(), getIdentifierColumnNames(), null, mapping );		}	}	private void initDiscriminatorPropertyPath(Mapping mapping) throws MappingException {		propertyMapping.initPropertyPaths( ENTITY_CLASS,				getDiscriminatorType(),				new String[]{getDiscriminatorColumnName()},				new String[]{getDiscriminatorFormulaTemplate()},				getFactory() );	}	protected void initPropertyPaths(Mapping mapping) throws MappingException {		initOrdinaryPropertyPaths(mapping);		initOrdinaryPropertyPaths(mapping); //do two passes, for collection property-ref!		initIdentifierPropertyPaths(mapping);		if ( entityMetamodel.isPolymorphic() ) {			initDiscriminatorPropertyPath( mapping );		}	}	protected UniqueEntityLoader createEntityLoader(LockMode lockMode, Map enabledFilters) throws MappingException {		//TODO: disable batch loading if lockMode > READ?		return BatchingEntityLoader.createBatchingEntityLoader( this, batchSize, lockMode, getFactory(), enabledFilters );	}	protected UniqueEntityLoader createEntityLoader(LockMode lockMode) throws MappingException {		return createEntityLoader( lockMode, CollectionHelper.EMPTY_MAP );	}	protected boolean check(int rows, Serializable id, int tableNumber, Expectation expectation, PreparedStatement statement) throws HibernateException {		try {			expectation.verifyOutcome( rows, statement, -1 );		}		catch( StaleStateException e ) {			if ( !isNullableTable( tableNumber ) ) {				if ( getFactory().getStatistics().isStatisticsEnabled() ) {					getFactory().getStatisticsImplementor()							.optimisticFailure( getEntityName() );				}				throw new StaleObjectStateException( getEntityName(), id );			}			return false;		}		catch( TooManyRowsAffectedException e ) {			throw new HibernateException(					"Duplicate identifier in table for: " +					MessageHelper.infoString( this, id, getFactory() )			);		}		catch ( Throwable t ) {			return false;		}		return true;	}	protected String generateUpdateString(boolean[] includeProperty, int j, boolean useRowId) {		return generateUpdateString( includeProperty, j, null, useRowId );	}	/**	 * Generate the SQL that updates a row by id (and version)	 */	protected String generateUpdateString(final boolean[] includeProperty,										  final int j,										  final Object[] oldFields,										  final boolean useRowId) {		Update update = new Update( getFactory().getDialect() ).setTableName( getTableName( j ) );		// select the correct row by either pk or rowid		if ( useRowId ) {			update.setPrimaryKeyColumnNames( new String[]{rowIdName} ); //TODO: eventually, rowIdName[j]		}		else {			update.setPrimaryKeyColumnNames( getKeyColumns( j ) );		}		boolean hasColumns = false;		for ( int i = 0; i < entityMetamodel.getPropertySpan(); i++ ) {			if ( includeProperty[i] && isPropertyOfTable( i, j ) ) {				// this is a property of the table, which we are updating				update.addColumns( getPropertyColumnNames(i), propertyColumnUpdateable[i] );				hasColumns = hasColumns || getPropertyColumnSpan( i ) > 0;			}		}		if ( j == 0 && isVersioned() && entityMetamodel.getOptimisticLockMode() == Versioning.OPTIMISTIC_LOCK_VERSION ) {			// this is the root (versioned) table, and we are using version-based			// optimistic locking;  if we are not updating the version, also don't			// check it (unless this is a "generated" version column)!			if ( checkVersion( includeProperty ) ) {				update.setVersionColumnName( getVersionColumnName() );				hasColumns = true;			}		}		else if ( entityMetamodel.getOptimisticLockMode() > Versioning.OPTIMISTIC_LOCK_VERSION && oldFields != null ) {			// we are using "all" or "dirty" property-based optimistic locking			boolean[] includeInWhere = entityMetamodel.getOptimisticLockMode() == Versioning.OPTIMISTIC_LOCK_ALL ?					getPropertyUpdateability() : //optimistic-lock="all", include all updatable properties					includeProperty; //optimistic-lock="dirty", include all properties we are updating this time			boolean[] versionability = getPropertyVersionability();			Type[] types = getPropertyTypes();			for ( int i = 0; i < entityMetamodel.getPropertySpan(); i++ ) {				boolean include = includeInWhere[i] &&						isPropertyOfTable( i, j ) &&						versionability[i];				if ( include ) {					// this property belongs to the table, and it is not specifically					// excluded from optimistic locking by optimistic-lock="false"					String[] propertyColumnNames = getPropertyColumnNames( i );					boolean[] propertyNullness = types[i].toColumnNullness( oldFields[i], getFactory() );					for ( int k=0; k<propertyNullness.length; k++ ) {						if ( propertyNullness[k] ) {							update.addWhereColumn( propertyColumnNames[k] );						}						else {							update.addWhereColumn( propertyColumnNames[k], " is null" );						}					}				}			}		}		if ( getFactory().getSettings().isCommentsEnabled() ) {			update.setComment( "update " + getEntityName() );		}		return hasColumns ? update.toStatementString() : null;	}	private boolean checkVersion(final boolean[] includeProperty) {        return includeProperty[ getVersionProperty() ] ||				entityMetamodel.getPropertyUpdateGenerationInclusions()[ getVersionProperty() ] != ValueInclusion.NONE;	}	protected String generateInsertString(boolean[] includeProperty, int j) {		return generateInsertString( false, includeProperty, j );	}	protected String generateInsertString(boolean identityInsert, boolean[] includeProperty) {		return generateInsertString( identityInsert, includeProperty, 0 );	}	/**	 * Generate the SQL that inserts a row	 */	protected String generateInsertString(boolean identityInsert, boolean[] includeProperty, int j) {		// todo : remove the identityInsert param and variations;		//   identity-insert strings are now generated from generateIdentityInsertString()		Insert insert = new Insert( getFactory().getDialect() )				.setTableName( getTableName( j ) );		// add normal properties		for ( int i = 0; i < entityMetamodel.getPropertySpan(); i++ ) {			if ( includeProperty[i] && isPropertyOfTable( i, j ) ) {				// this property belongs on the table and is to be inserted				insert.addColumns( getPropertyColumnNames(i), propertyColumnInsertable[i] );			}		}		// add the discriminator		if ( 

⌨️ 快捷键说明

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