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

📄 abstractpropertymapping.java

📁 hibernate 开源框架的代码 jar包希望大家能喜欢
💻 JAVA
字号:
//$Id: AbstractPropertyMapping.java 10852 2006-11-21 17:39:14Z steve.ebersole@jboss.com $package org.hibernate.persister.entity;import java.util.HashMap;import java.util.Map;import org.hibernate.MappingException;import org.hibernate.QueryException;import org.hibernate.engine.Mapping;import org.hibernate.sql.Template;import org.hibernate.type.AbstractComponentType;import org.hibernate.type.AssociationType;import org.hibernate.type.EntityType;import org.hibernate.type.Type;import org.hibernate.util.ArrayHelper;import org.hibernate.util.StringHelper;/** * Base implementation of a <tt>PropertyMapping</tt> * * @author Gavin King */public abstract class AbstractPropertyMapping implements PropertyMapping {	private final Map typesByPropertyPath = new HashMap();	private final Map columnsByPropertyPath = new HashMap();	private final Map formulaTemplatesByPropertyPath = new HashMap();	public String[] getIdentifierColumnNames() {		throw new UnsupportedOperationException("one-to-one is not supported here");	}	protected abstract String getEntityName();	public Type toType(String propertyName) throws QueryException {		Type type = (Type) typesByPropertyPath.get(propertyName);		if ( type == null ) {			throw propertyException( propertyName );		}		return type;	}	protected final QueryException propertyException(String propertyName) throws QueryException {		return new QueryException( "could not resolve property: " + propertyName + " of: " + getEntityName() );	}	public String[] getColumnNames(String propertyName) {		String[] cols = (String[]) columnsByPropertyPath.get(propertyName);		if (cols==null) {			throw new MappingException("unknown property: " + propertyName);		}		return cols;	}	public String[] toColumns(String alias, String propertyName) throws QueryException {		//TODO: *two* hashmap lookups here is one too many...		String[] columns = (String[]) columnsByPropertyPath.get(propertyName);		if ( columns == null ) {			throw propertyException( propertyName );		}		String[] templates = (String[]) formulaTemplatesByPropertyPath.get(propertyName);		String[] result = new String[columns.length];		for ( int i=0; i<columns.length; i++ ) {			if ( columns[i]==null ) {				result[i] = StringHelper.replace( templates[i], Template.TEMPLATE, alias );			}			else {				result[i] = StringHelper.qualify( alias, columns[i] );			}		}		return result;	}	public String[] toColumns(String propertyName) throws QueryException {		String[] columns = (String[]) columnsByPropertyPath.get(propertyName);		if ( columns == null ) {			throw propertyException( propertyName );		}		String[] templates = (String[]) formulaTemplatesByPropertyPath.get(propertyName);		String[] result = new String[columns.length];		for ( int i=0; i<columns.length; i++ ) {			if ( columns[i]==null ) {				result[i] = StringHelper.replace( templates[i], Template.TEMPLATE, "" );			}			else {				result[i] = columns[i];			}		}		return result;	}	protected void addPropertyPath(String path, Type type, String[] columns, String[] formulaTemplates) {		typesByPropertyPath.put(path, type);		columnsByPropertyPath.put(path, columns);		if (formulaTemplates!=null) {			formulaTemplatesByPropertyPath.put(path, formulaTemplates);		}	}	/*protected void initPropertyPaths(			final String path,			final Type type,			final String[] columns,			final String[] formulaTemplates,			final Mapping factory)	throws MappingException {		//addFormulaPropertyPath(path, type, formulaTemplates);		initPropertyPaths(path, type, columns, formulaTemplates, factory);	}*/	protected void initPropertyPaths(			final String path,			final Type type,			String[] columns,			final String[] formulaTemplates,			final Mapping factory)	throws MappingException {		if ( columns.length!=type.getColumnSpan(factory) ) {			throw new MappingException(					"broken column mapping for: " + path +					" of: " + getEntityName()				);		}		if ( type.isAssociationType() ) {			AssociationType actype = (AssociationType) type;			if ( actype.useLHSPrimaryKey() ) {				columns = getIdentifierColumnNames();			}			else {				String foreignKeyProperty = actype.getLHSPropertyName();				if ( foreignKeyProperty!=null && !path.equals(foreignKeyProperty) ) {					//TODO: this requires that the collection is defined after the					//      referenced property in the mapping file (ok?)					columns = (String[]) columnsByPropertyPath.get(foreignKeyProperty);					if (columns==null) return; //get em on the second pass!				}			}		}		if (path!=null) addPropertyPath(path, type, columns, formulaTemplates);		if ( type.isComponentType() ) {			AbstractComponentType actype = (AbstractComponentType) type;			initComponentPropertyPaths( path, actype, columns, formulaTemplates, factory );			if ( actype.isEmbedded() ) {				initComponentPropertyPaths(						path==null ? null : StringHelper.qualifier(path),						actype,						columns,						formulaTemplates,						factory					);			}		}		else if ( type.isEntityType() ) {			initIdentifierPropertyPaths( path, (EntityType) type, columns, factory );		}	}	protected void initIdentifierPropertyPaths(			final String path,			final EntityType etype,			final String[] columns,			final Mapping factory) throws MappingException {		Type idtype = etype.getIdentifierOrUniqueKeyType( factory );		String idPropName = etype.getIdentifierOrUniqueKeyPropertyName(factory);		boolean hasNonIdentifierPropertyNamedId = hasNonIdentifierPropertyNamedId( etype, factory );		if ( etype.isReferenceToPrimaryKey() ) {			if ( !hasNonIdentifierPropertyNamedId ) {				String idpath1 = extendPath(path, EntityPersister.ENTITY_ID);				addPropertyPath(idpath1, idtype, columns, null);				initPropertyPaths(idpath1, idtype, columns, null, factory);			}		}		if (idPropName!=null) {			String idpath2 = extendPath(path, idPropName);			addPropertyPath(idpath2, idtype, columns, null);			initPropertyPaths(idpath2, idtype, columns, null, factory);		}	}	private boolean hasNonIdentifierPropertyNamedId(final EntityType entityType, final Mapping factory) {		// TODO : would be great to have a Mapping#hasNonIdentifierPropertyNamedId method		// I don't believe that Mapping#getReferencedPropertyType accounts for the identifier property; so		// if it returns for a property named 'id', then we should have a non-id field named id		try {			return factory.getReferencedPropertyType( entityType.getAssociatedEntityName(), EntityPersister.ENTITY_ID ) != null;		}		catch( MappingException e ) {			return false;		}	}	protected void initComponentPropertyPaths(			final String path,			final AbstractComponentType type,			final String[] columns,			String[] formulaTemplates, final Mapping factory)	throws MappingException {		Type[] types = type.getSubtypes();		String[] properties = type.getPropertyNames();		int begin=0;		for ( int i=0; i<properties.length; i++ ) {			String subpath = extendPath( path, properties[i] );			try {				int length = types[i].getColumnSpan(factory);				String[] columnSlice = ArrayHelper.slice(columns, begin, length);				String[] formulaSlice = formulaTemplates==null ?						null : ArrayHelper.slice(formulaTemplates, begin, length);				initPropertyPaths(subpath, types[i], columnSlice, formulaSlice, factory);				begin+=length;			}			catch (Exception e) {				throw new MappingException("bug in initComponentPropertyPaths", e);			}		}	}	private static String extendPath(String path, String property) {		if ( path==null || "".equals(path) ) {			return property;		}		else {			return StringHelper.qualify(path, property);		}	}}

⌨️ 快捷键说明

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