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

📄 componenttype.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
//$Id: ComponentType.java 10119 2006-07-14 00:09:19Z steve.ebersole@jboss.com $package org.hibernate.type;import java.io.Serializable;import java.lang.reflect.Method;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import org.dom4j.Element;import org.dom4j.Node;import org.hibernate.EntityMode;import org.hibernate.FetchMode;import org.hibernate.HibernateException;import org.hibernate.MappingException;import org.hibernate.engine.CascadeStyle;import org.hibernate.engine.Mapping;import org.hibernate.engine.SessionFactoryImplementor;import org.hibernate.engine.SessionImplementor;import org.hibernate.tuple.component.ComponentTuplizer;import org.hibernate.tuple.component.ComponentMetamodel;import org.hibernate.tuple.StandardProperty;import org.hibernate.tuple.EntityModeToTuplizerMapping;import org.hibernate.util.ArrayHelper;import org.hibernate.util.StringHelper;/** * Handles "component" mappings * * @author Gavin King */public class ComponentType extends AbstractType implements AbstractComponentType {	private final String[] propertyNames;	private final Type[] propertyTypes;	private final boolean[] propertyNullability;	protected final int propertySpan;	private final CascadeStyle[] cascade;	private final FetchMode[] joinedFetch;	private final boolean isKey;	protected final EntityModeToTuplizerMapping tuplizerMapping;	public ComponentType(ComponentMetamodel metamodel) {		// for now, just "re-flatten" the metamodel since this is temporary stuff anyway (HHH-1907)		this.isKey = metamodel.isKey();		this.propertySpan = metamodel.getPropertySpan();		this.propertyNames = new String[ propertySpan ];		this.propertyTypes = new Type[ propertySpan ];		this.propertyNullability = new boolean[ propertySpan ];		this.cascade = new CascadeStyle[ propertySpan ];		this.joinedFetch = new FetchMode[ propertySpan ];		for ( int i = 0; i < propertySpan; i++ ) {			StandardProperty prop = metamodel.getProperty( i );			this.propertyNames[i] = prop.getName();			this.propertyTypes[i] = prop.getType();			this.propertyNullability[i] = prop.isNullable();			this.cascade[i] = prop.getCascadeStyle();			this.joinedFetch[i] = prop.getFetchMode();		}		this.tuplizerMapping = metamodel.getTuplizerMapping();	}	public int[] sqlTypes(Mapping mapping) throws MappingException {		//Not called at runtime so doesn't matter if its slow :)		int[] sqlTypes = new int[getColumnSpan( mapping )];		int n = 0;		for ( int i = 0; i < propertySpan; i++ ) {			int[] subtypes = propertyTypes[i].sqlTypes( mapping );			for ( int j = 0; j < subtypes.length; j++ ) {				sqlTypes[n++] = subtypes[j];			}		}		return sqlTypes;	}	public int getColumnSpan(Mapping mapping) throws MappingException {		int span = 0;		for ( int i = 0; i < propertySpan; i++ ) {			span += propertyTypes[i].getColumnSpan( mapping );		}		return span;	}	public final boolean isComponentType() {		return true;	}	public Class getReturnedClass() {		return tuplizerMapping.getTuplizer( EntityMode.POJO ).getMappedClass(); //TODO	}	public boolean isSame(Object x, Object y, EntityMode entityMode) throws HibernateException {		if ( x == y ) {			return true;		}		if ( x == null || y == null ) {			return false;		}		Object[] xvalues = getPropertyValues( x, entityMode );		Object[] yvalues = getPropertyValues( y, entityMode );		for ( int i = 0; i < propertySpan; i++ ) {			if ( !propertyTypes[i].isSame( xvalues[i], yvalues[i], entityMode ) ) {				return false;			}		}		return true;	}	public boolean isEqual(Object x, Object y, EntityMode entityMode)			throws HibernateException {		if ( x == y ) {			return true;		}		if ( x == null || y == null ) {			return false;		}		Object[] xvalues = getPropertyValues( x, entityMode );		Object[] yvalues = getPropertyValues( y, entityMode );		for ( int i = 0; i < propertySpan; i++ ) {			if ( !propertyTypes[i].isEqual( xvalues[i], yvalues[i], entityMode ) ) {				return false;			}		}		return true;	}	public boolean isEqual(Object x, Object y, EntityMode entityMode, SessionFactoryImplementor factory)			throws HibernateException {		if ( x == y ) {			return true;		}		if ( x == null || y == null ) {			return false;		}		Object[] xvalues = getPropertyValues( x, entityMode );		Object[] yvalues = getPropertyValues( y, entityMode );		for ( int i = 0; i < propertySpan; i++ ) {			if ( !propertyTypes[i].isEqual( xvalues[i], yvalues[i], entityMode, factory ) ) {				return false;			}		}		return true;	}	public int compare(Object x, Object y, EntityMode entityMode) {		if ( x == y ) {			return 0;		}		Object[] xvalues = getPropertyValues( x, entityMode );		Object[] yvalues = getPropertyValues( y, entityMode );		for ( int i = 0; i < propertySpan; i++ ) {			int propertyCompare = propertyTypes[i].compare( xvalues[i], yvalues[i], entityMode );			if ( propertyCompare != 0 ) {				return propertyCompare;			}		}		return 0;	}	public boolean isMethodOf(Method method) {		return false;	}	public int getHashCode(Object x, EntityMode entityMode) {		int result = 17;		Object[] values = getPropertyValues( x, entityMode );		for ( int i = 0; i < propertySpan; i++ ) {			Object y = values[i];			result *= 37;			if ( y != null ) {				result += propertyTypes[i].getHashCode( y, entityMode );			}		}		return result;	}	public int getHashCode(Object x, EntityMode entityMode, SessionFactoryImplementor factory) {		int result = 17;		Object[] values = getPropertyValues( x, entityMode );		for ( int i = 0; i < propertySpan; i++ ) {			Object y = values[i];			result *= 37;			if ( y != null ) {				result += propertyTypes[i].getHashCode( y, entityMode, factory );			}		}		return result;	}	public boolean isDirty(Object x, Object y, SessionImplementor session)			throws HibernateException {		if ( x == y ) {			return false;		}		if ( x == null || y == null ) {			return true;		}		EntityMode entityMode = session.getEntityMode();		Object[] xvalues = getPropertyValues( x, entityMode );		Object[] yvalues = getPropertyValues( y, entityMode );		for ( int i = 0; i < xvalues.length; i++ ) {			if ( propertyTypes[i].isDirty( xvalues[i], yvalues[i], session ) ) {				return true;			}		}		return false;	}	public boolean isDirty(Object x, Object y, boolean[] checkable, SessionImplementor session)			throws HibernateException {		if ( x == y ) {			return false;		}		if ( x == null || y == null ) {			return true;		}		EntityMode entityMode = session.getEntityMode();		Object[] xvalues = getPropertyValues( x, entityMode );		Object[] yvalues = getPropertyValues( y, entityMode );		int loc = 0;		for ( int i = 0; i < xvalues.length; i++ ) {			int len = propertyTypes[i].getColumnSpan( session.getFactory() );			if ( len <= 1 ) {				final boolean dirty = ( len == 0 || checkable[loc] ) &&				                      propertyTypes[i].isDirty( xvalues[i], yvalues[i], session );				if ( dirty ) {					return true;				}			}			else {				boolean[] subcheckable = new boolean[len];				System.arraycopy( checkable, loc, subcheckable, 0, len );				final boolean dirty = propertyTypes[i].isDirty( xvalues[i], yvalues[i], subcheckable, session );				if ( dirty ) {					return true;				}			}			loc += len;		}		return false;	}	public boolean isModified(Object old, Object current, boolean[] checkable, SessionImplementor session)			throws HibernateException {		if ( current == null ) {			return old != null;		}		if ( old == null ) {			return current != null;		}		Object[] currentValues = getPropertyValues( current, session );		Object[] oldValues = ( Object[] ) old;		int loc = 0;		for ( int i = 0; i < currentValues.length; i++ ) {			int len = propertyTypes[i].getColumnSpan( session.getFactory() );			boolean[] subcheckable = new boolean[len];			System.arraycopy( checkable, loc, subcheckable, 0, len );			if ( propertyTypes[i].isModified( oldValues[i], currentValues[i], subcheckable, session ) ) {				return true;			}			loc += len;		}		return false;	}	public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)			throws HibernateException, SQLException {		return resolve( hydrate( rs, names, session, owner ), session, owner );	}	public void nullSafeSet(PreparedStatement st, Object value, int begin, SessionImplementor session)			throws HibernateException, SQLException {		Object[] subvalues = nullSafeGetValues( value, session.getEntityMode() );		for ( int i = 0; i < propertySpan; i++ ) {			propertyTypes[i].nullSafeSet( st, subvalues[i], begin, session );			begin += propertyTypes[i].getColumnSpan( session.getFactory() );		}	}	public void nullSafeSet(			PreparedStatement st,			Object value,			int begin,			boolean[] settable,			SessionImplementor session)			throws HibernateException, SQLException {		Object[] subvalues = nullSafeGetValues( value, session.getEntityMode() );		int loc = 0;		for ( int i = 0; i < propertySpan; i++ ) {			int len = propertyTypes[i].getColumnSpan( session.getFactory() );			if ( len == 0 ) {				//noop			}			else if ( len == 1 ) {				if ( settable[loc] ) {					propertyTypes[i].nullSafeSet( st, subvalues[i], begin, session );					begin++;				}			}			else {				boolean[] subsettable = new boolean[len];				System.arraycopy( settable, loc, subsettable, 0, len );				propertyTypes[i].nullSafeSet( st, subvalues[i], begin, subsettable, session );				begin += ArrayHelper.countTrue( subsettable );			}			loc += len;		}	}

⌨️ 快捷键说明

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