📄 componenttype.java
字号:
//$Id: ComponentType.java 7670 2005-07-29 05:36:14Z oneovthafew $
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.ComponentTuplizer;
import org.hibernate.tuple.TuplizerLookup;
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 Type[] propertyTypes;
private final String[] propertyNames;
private final boolean[] propertyNullability;
protected final int propertySpan;
private final CascadeStyle[] cascade;
private final FetchMode[] joinedFetch;
private final boolean isKey;
protected TuplizerLookup tuplizers;
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 ComponentType(
final String[] propertyNames,
final Type[] propertyTypes,
final boolean[] nullabilities,
final FetchMode[] joinedFetch,
final CascadeStyle[] cascade,
final boolean key,
final TuplizerLookup tuplizers)
throws MappingException {
this.propertyTypes = propertyTypes;
this.propertyNullability = nullabilities;
this.propertyNames = propertyNames;
this.cascade = cascade;
this.joinedFetch = joinedFetch;
isKey = key;
propertySpan = propertyTypes.length;
this.tuplizers = tuplizers;
}
public final boolean isComponentType() {
return true;
}
public Class getReturnedClass() {
return tuplizers.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;
}
}
private Object[] nullSafeGetValues(Object value, EntityMode entityMode) throws HibernateException {
if ( value == null ) {
return new Object[propertySpan];
}
else {
return getPropertyValues( value, entityMode );
}
}
public Object nullSafeGet(ResultSet rs, String name, SessionImplementor session, Object owner)
throws HibernateException, SQLException {
return nullSafeGet( rs, new String[]{name}, session, owner );
}
public Object getPropertyValue(Object component, int i, SessionImplementor session)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -