HHH-7586 Re-architect SimpleValue's reflection for dynamic descriptors
This commit is contained in:
parent
69bcccaa1a
commit
7ce07642cb
|
@ -42,7 +42,6 @@ import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
import org.hibernate.internal.util.collections.ArrayHelper;
|
||||||
import org.hibernate.metamodel.relational.Size;
|
import org.hibernate.metamodel.relational.Size;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
||||||
|
@ -59,8 +58,10 @@ public abstract class AbstractStandardBasicType<T>
|
||||||
private static final Size DEFAULT_SIZE = new Size( 19, 2, 255, Size.LobMultiplier.NONE ); // to match legacy behavior
|
private static final Size DEFAULT_SIZE = new Size( 19, 2, 255, Size.LobMultiplier.NONE ); // to match legacy behavior
|
||||||
private final Size dictatedSize = new Size();
|
private final Size dictatedSize = new Size();
|
||||||
|
|
||||||
private final SqlTypeDescriptor sqlTypeDescriptor;
|
// Don't use final here. Need to initialize after-the-fact
|
||||||
private final JavaTypeDescriptor<T> javaTypeDescriptor;
|
// by DynamicParameterizedTypes.
|
||||||
|
private SqlTypeDescriptor sqlTypeDescriptor;
|
||||||
|
private JavaTypeDescriptor<T> javaTypeDescriptor;
|
||||||
|
|
||||||
public AbstractStandardBasicType(SqlTypeDescriptor sqlTypeDescriptor, JavaTypeDescriptor<T> javaTypeDescriptor) {
|
public AbstractStandardBasicType(SqlTypeDescriptor sqlTypeDescriptor, JavaTypeDescriptor<T> javaTypeDescriptor) {
|
||||||
this.sqlTypeDescriptor = sqlTypeDescriptor;
|
this.sqlTypeDescriptor = sqlTypeDescriptor;
|
||||||
|
@ -125,29 +126,24 @@ public abstract class AbstractStandardBasicType<T>
|
||||||
return dictatedSize;
|
return dictatedSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This is necessary due to legacy SimpleValue and DynamicParameterizedType
|
|
||||||
* usage. Entity types come in *after* the descriptors have been
|
|
||||||
* intialized, so this is used to over-ride as necessary.
|
|
||||||
*
|
|
||||||
* @return ValueExtractor
|
|
||||||
*/
|
|
||||||
// TODO: Remove (or make private) after HHH-7586.
|
|
||||||
protected ValueExtractor<T> getExtractor(WrapperOptions options) {
|
|
||||||
return remapSqlTypeDescriptor( options ).getExtractor( javaTypeDescriptor );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// final implementations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// final implementations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
public final JavaTypeDescriptor<T> getJavaTypeDescriptor() {
|
public final JavaTypeDescriptor<T> getJavaTypeDescriptor() {
|
||||||
return javaTypeDescriptor;
|
return javaTypeDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final void setJavaTypeDescriptor( JavaTypeDescriptor<T> javaTypeDescriptor ) {
|
||||||
|
this.javaTypeDescriptor = javaTypeDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
public final SqlTypeDescriptor getSqlTypeDescriptor() {
|
public final SqlTypeDescriptor getSqlTypeDescriptor() {
|
||||||
return sqlTypeDescriptor;
|
return sqlTypeDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final void setSqlTypeDescriptor( SqlTypeDescriptor sqlTypeDescriptor ) {
|
||||||
|
this.sqlTypeDescriptor = sqlTypeDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
public final Class getReturnedClass() {
|
public final Class getReturnedClass() {
|
||||||
return javaTypeDescriptor.getJavaTypeClass();
|
return javaTypeDescriptor.getJavaTypeClass();
|
||||||
}
|
}
|
||||||
|
@ -279,7 +275,7 @@ public abstract class AbstractStandardBasicType<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final T nullSafeGet(ResultSet rs, String name, WrapperOptions options) throws SQLException {
|
protected final T nullSafeGet(ResultSet rs, String name, WrapperOptions options) throws SQLException {
|
||||||
return getExtractor(options).extract( rs, name, options );
|
return remapSqlTypeDescriptor( options ).getExtractor( javaTypeDescriptor ).extract( rs, name, options );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object get(ResultSet rs, String name, SessionImplementor session) throws HibernateException, SQLException {
|
public Object get(ResultSet rs, String name, SessionImplementor session) throws HibernateException, SQLException {
|
||||||
|
@ -425,7 +421,7 @@ public abstract class AbstractStandardBasicType<T>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return getExtractor(options).extract(
|
return remapSqlTypeDescriptor( options ).getExtractor( javaTypeDescriptor ).extract(
|
||||||
statement,
|
statement,
|
||||||
startIndex,
|
startIndex,
|
||||||
options
|
options
|
||||||
|
@ -452,6 +448,6 @@ public abstract class AbstractStandardBasicType<T>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return getExtractor(options).extract( statement, paramNames, options );
|
return remapSqlTypeDescriptor( options ).getExtractor( javaTypeDescriptor ).extract( statement, paramNames, options );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,9 +28,6 @@ import java.util.Properties;
|
||||||
|
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.internal.util.ReflectHelper;
|
import org.hibernate.internal.util.ReflectHelper;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
|
||||||
import org.hibernate.type.descriptor.java.SerializableTypeDescriptor;
|
import org.hibernate.type.descriptor.java.SerializableTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.sql.BlobTypeDescriptor;
|
import org.hibernate.type.descriptor.sql.BlobTypeDescriptor;
|
||||||
import org.hibernate.usertype.DynamicParameterizedType;
|
import org.hibernate.usertype.DynamicParameterizedType;
|
||||||
|
@ -44,14 +41,10 @@ public class SerializableToBlobType<T extends Serializable> extends AbstractSing
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private JavaTypeDescriptor<T> javaTypeDescriptor = new SerializableTypeDescriptor( Serializable.class );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param sqlTypeDescriptor
|
* @param sqlTypeDescriptor
|
||||||
* @param javaTypeDescriptor
|
* @param javaTypeDescriptor
|
||||||
*/
|
*/
|
||||||
// TODO: After HHH-7586, this should eventually use the actual T class.
|
|
||||||
// But, for now, just use Serializable.
|
|
||||||
public SerializableToBlobType() {
|
public SerializableToBlobType() {
|
||||||
super( BlobTypeDescriptor.DEFAULT, new SerializableTypeDescriptor( Serializable.class ) );
|
super( BlobTypeDescriptor.DEFAULT, new SerializableTypeDescriptor( Serializable.class ) );
|
||||||
}
|
}
|
||||||
|
@ -60,39 +53,27 @@ public class SerializableToBlobType<T extends Serializable> extends AbstractSing
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return null;
|
return getClass().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
// TODO: This method (and DynamicParameterizedType) should go away after HHH-7586.
|
|
||||||
public void setParameterValues(Properties parameters) {
|
public void setParameterValues(Properties parameters) {
|
||||||
ParameterType reader = (ParameterType) parameters.get( PARAMETER_TYPE );
|
ParameterType reader = (ParameterType) parameters.get( PARAMETER_TYPE );
|
||||||
if ( reader != null ) {
|
if ( reader != null ) {
|
||||||
javaTypeDescriptor = new SerializableTypeDescriptor<T>( reader.getReturnedClass() );
|
setJavaTypeDescriptor( new SerializableTypeDescriptor<T>( reader.getReturnedClass() ) );
|
||||||
} else {
|
} else {
|
||||||
String className = parameters.getProperty( CLASS_NAME );
|
String className = parameters.getProperty( CLASS_NAME );
|
||||||
if ( className == null ) {
|
if ( className == null ) {
|
||||||
throw new MappingException( "No class name defined for type: " + SerializableToBlobType.class.getName() );
|
throw new MappingException( "No class name defined for type: " + SerializableToBlobType.class.getName() );
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
javaTypeDescriptor = new SerializableTypeDescriptor<T>( ReflectHelper.classForName( className ) );
|
setJavaTypeDescriptor( new SerializableTypeDescriptor<T>( ReflectHelper.classForName( className ) ) );
|
||||||
} catch ( ClassNotFoundException e ) {
|
} catch ( ClassNotFoundException e ) {
|
||||||
throw new MappingException( "Unable to load class from " + CLASS_NAME + " parameter", e );
|
throw new MappingException( "Unable to load class from " + CLASS_NAME + " parameter", e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
// TODO: Remove after HHH-7586.
|
|
||||||
protected ValueExtractor<T> getExtractor(WrapperOptions options) {
|
|
||||||
return remapSqlTypeDescriptor( options ).getExtractor( javaTypeDescriptor );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue