mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-03-02 15:59:18 +00:00
HHH-7183 : Bind HibernateTypeDescriptor fields once
This commit is contained in:
parent
0b3baf5812
commit
f42efc1598
@ -55,11 +55,13 @@
|
|||||||
import org.hibernate.metamodel.spi.binding.EntityVersion;
|
import org.hibernate.metamodel.spi.binding.EntityVersion;
|
||||||
import org.hibernate.metamodel.spi.binding.HibernateTypeDescriptor;
|
import org.hibernate.metamodel.spi.binding.HibernateTypeDescriptor;
|
||||||
import org.hibernate.metamodel.spi.binding.IdGenerator;
|
import org.hibernate.metamodel.spi.binding.IdGenerator;
|
||||||
|
import org.hibernate.metamodel.spi.binding.IndexedPluralAttributeBinding;
|
||||||
import org.hibernate.metamodel.spi.binding.InheritanceType;
|
import org.hibernate.metamodel.spi.binding.InheritanceType;
|
||||||
import org.hibernate.metamodel.spi.binding.ManyToOneAttributeBinding;
|
import org.hibernate.metamodel.spi.binding.ManyToOneAttributeBinding;
|
||||||
import org.hibernate.metamodel.spi.binding.MetaAttribute;
|
import org.hibernate.metamodel.spi.binding.MetaAttribute;
|
||||||
import org.hibernate.metamodel.spi.binding.PluralAttributeBinding;
|
import org.hibernate.metamodel.spi.binding.PluralAttributeBinding;
|
||||||
import org.hibernate.metamodel.spi.binding.PluralAttributeElementNature;
|
import org.hibernate.metamodel.spi.binding.PluralAttributeElementNature;
|
||||||
|
import org.hibernate.metamodel.spi.binding.PluralAttributeIndexBinding;
|
||||||
import org.hibernate.metamodel.spi.binding.PluralAttributeKeyBinding;
|
import org.hibernate.metamodel.spi.binding.PluralAttributeKeyBinding;
|
||||||
import org.hibernate.metamodel.spi.binding.RelationalValueBinding;
|
import org.hibernate.metamodel.spi.binding.RelationalValueBinding;
|
||||||
import org.hibernate.metamodel.spi.binding.SecondaryTable;
|
import org.hibernate.metamodel.spi.binding.SecondaryTable;
|
||||||
@ -272,8 +274,9 @@ private BasicAttributeBinding bindBasicAttribute(
|
|||||||
attributeSource.getGeneration() );
|
attributeSource.getGeneration() );
|
||||||
final HibernateTypeDescriptor hibernateTypeDescriptor = attributeBinding.getHibernateTypeDescriptor();
|
final HibernateTypeDescriptor hibernateTypeDescriptor = attributeBinding.getHibernateTypeDescriptor();
|
||||||
bindHibernateTypeDescriptor(
|
bindHibernateTypeDescriptor(
|
||||||
attributeBinding,
|
attributeBinding.getHibernateTypeDescriptor(),
|
||||||
attributeSource.getTypeInformation()
|
attributeSource.getTypeInformation(),
|
||||||
|
createSingularAttributeJavaType( attributeBinding.getAttribute() )
|
||||||
);
|
);
|
||||||
Type resolvedType = getHeuristicType( hibernateTypeDescriptor );
|
Type resolvedType = getHeuristicType( hibernateTypeDescriptor );
|
||||||
resolveHibernateResolvedType( attributeBinding.getHibernateTypeDescriptor(), resolvedType );
|
resolveHibernateResolvedType( attributeBinding.getHibernateTypeDescriptor(), resolvedType );
|
||||||
@ -342,11 +345,12 @@ private void bindBasicCollectionElement(
|
|||||||
private void bindCollectionIndex(
|
private void bindCollectionIndex(
|
||||||
final AbstractPluralAttributeBinding attributeBinding,
|
final AbstractPluralAttributeBinding attributeBinding,
|
||||||
final PluralAttributeSource attributeSource,
|
final PluralAttributeSource attributeSource,
|
||||||
final String defaultElementJavaTypeNam) {
|
final String defaultElementJavaTypeName) {
|
||||||
if ( attributeSource.getPluralAttributeNature() != PluralAttributeNature.LIST &&
|
if ( ! IndexedPluralAttributeBinding.class.isInstance( attributeBinding ) ) {
|
||||||
attributeSource.getPluralAttributeNature() != PluralAttributeNature.MAP ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
final PluralAttributeIndexBinding indexBinding
|
||||||
|
= ( (IndexedPluralAttributeBinding) attributeBinding ).getPluralAttributeIndexBinding();
|
||||||
// todo : implement
|
// todo : implement
|
||||||
throw new NotYetImplementedException();
|
throw new NotYetImplementedException();
|
||||||
}
|
}
|
||||||
@ -516,13 +520,6 @@ private void bindCollectionTablePrimaryKey(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ( attributeBinding.getPluralAttributeElementBinding().getPluralAttributeElementNature() == PluralAttributeElementNature.BASIC ) {
|
if ( attributeBinding.getPluralAttributeElementBinding().getPluralAttributeElementNature() == PluralAttributeElementNature.BASIC ) {
|
||||||
bindHibernateTypeDescriptor(
|
|
||||||
attributeBinding.getPluralAttributeElementBinding().getHibernateTypeDescriptor(),
|
|
||||||
( (BasicPluralAttributeElementSource) attributeSource.getElementSource() ).getExplicitHibernateTypeSource(),
|
|
||||||
reflectedCollectionJavaTypes != null && reflectedCollectionJavaTypes.getCollectionElementType() != null ?
|
|
||||||
reflectedCollectionJavaTypes.getCollectionElementType().getName() :
|
|
||||||
null
|
|
||||||
);
|
|
||||||
if ( attributeSource.getPluralAttributeNature() == PluralAttributeNature.SET ) {
|
if ( attributeSource.getPluralAttributeNature() == PluralAttributeNature.SET ) {
|
||||||
bindBasicElementSetTablePrimaryKey( ( SetBinding ) attributeBinding );
|
bindBasicElementSetTablePrimaryKey( ( SetBinding ) attributeBinding );
|
||||||
} else {
|
} else {
|
||||||
@ -670,21 +667,50 @@ private EntityBinding bindEntity( final EntitySource entitySource, final EntityB
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void bindHibernateTypeDescriptor(
|
private void bindHibernateTypeDescriptor(
|
||||||
final SingularAttributeBinding singularAttributeBinding,
|
final HibernateTypeDescriptor hibernateTypeDescriptor,
|
||||||
final ExplicitHibernateTypeSource typeSource) {
|
final ExplicitHibernateTypeSource explicitTypeSource,
|
||||||
|
final org.hibernate.internal.util.Value<Class<?>> defaultJavaType) {
|
||||||
|
// if there is an explicit type name specified, then there's no reason to
|
||||||
|
// initialize the default Java type name; simply pass a null default instead.
|
||||||
bindHibernateTypeDescriptor(
|
bindHibernateTypeDescriptor(
|
||||||
singularAttributeBinding.getHibernateTypeDescriptor(),
|
hibernateTypeDescriptor,
|
||||||
typeSource,
|
explicitTypeSource,
|
||||||
determineJavaType( singularAttributeBinding.getAttribute() ).getName()
|
explicitTypeSource.getName() == null ? defaultJavaType.getValue().getName() : null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindExplicitHibernateTypeDescriptor(
|
private void bindHibernateTypeDescriptor(
|
||||||
final HibernateTypeDescriptor hibernateTypeDescriptor,
|
final HibernateTypeDescriptor hibernateTypeDescriptor,
|
||||||
final String typeName,
|
final ExplicitHibernateTypeSource explicitTypeSource,
|
||||||
final Map<String, String> typeParameters) {
|
final String defaultJavaTypeName) {
|
||||||
|
if ( explicitTypeSource.getName() == null ) {
|
||||||
|
if ( hibernateTypeDescriptor.getJavaTypeName() != null ) {
|
||||||
|
throw new MappingException(
|
||||||
|
String.format(
|
||||||
|
"Attempt to re-initialize (non-explicit) Java type name; current=%s new=%s",
|
||||||
|
hibernateTypeDescriptor.getJavaTypeName(),
|
||||||
|
defaultJavaTypeName
|
||||||
|
),
|
||||||
|
bindingContexts.peek().getOrigin()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
hibernateTypeDescriptor.setJavaTypeName( defaultJavaTypeName );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
final String typeName = explicitTypeSource.getName();
|
||||||
|
final Map<String,String> typeParameters = explicitTypeSource.getParameters();
|
||||||
// Check if user-specified name is of a User-Defined Type (UDT)
|
// Check if user-specified name is of a User-Defined Type (UDT)
|
||||||
final TypeDefinition typeDef = metadata.getTypeDefinition( typeName );
|
final TypeDefinition typeDef = metadata.getTypeDefinition( typeName );
|
||||||
|
if ( hibernateTypeDescriptor.getExplicitTypeName() != null ) {
|
||||||
|
throw new MappingException(
|
||||||
|
String.format(
|
||||||
|
"Attempt to re-initialize explicity-mapped Java type name; current=%s new=%s",
|
||||||
|
hibernateTypeDescriptor.getExplicitTypeName(),
|
||||||
|
typeName
|
||||||
|
),
|
||||||
|
bindingContexts.peek().getOrigin()
|
||||||
|
);
|
||||||
|
}
|
||||||
if ( typeDef == null ) {
|
if ( typeDef == null ) {
|
||||||
hibernateTypeDescriptor.setExplicitTypeName( typeName );
|
hibernateTypeDescriptor.setExplicitTypeName( typeName );
|
||||||
} else {
|
} else {
|
||||||
@ -695,28 +721,20 @@ private void bindExplicitHibernateTypeDescriptor(
|
|||||||
hibernateTypeDescriptor.getTypeParameters().putAll( typeParameters );
|
hibernateTypeDescriptor.getTypeParameters().putAll( typeParameters );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Class<?> determineJavaType(Attribute attribute) {
|
private static org.hibernate.internal.util.Value<Class<?>> createSingularAttributeJavaType(
|
||||||
|
final SingularAttribute attribute) {
|
||||||
|
org.hibernate.internal.util.Value.DeferredInitializer<Class<?>> deferredInitializer =
|
||||||
|
new org.hibernate.internal.util.Value.DeferredInitializer<Class<?>>() {
|
||||||
|
public Class<?> initialize() {
|
||||||
return ReflectHelper.reflectedPropertyClass(
|
return ReflectHelper.reflectedPropertyClass(
|
||||||
attribute.getAttributeContainer().getClassReference(),
|
attribute.getAttributeContainer().getClassReference(),
|
||||||
attribute.getName()
|
attribute.getName()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
private void bindHibernateTypeDescriptor(
|
return new org.hibernate.internal.util.Value<Class<?>>( deferredInitializer );
|
||||||
final HibernateTypeDescriptor hibernateTypeDescriptor,
|
|
||||||
final ExplicitHibernateTypeSource explicitTypeSource,
|
|
||||||
final String defaultJavaTypeName) {
|
|
||||||
if ( explicitTypeSource.getName() == null ) {
|
|
||||||
if ( hibernateTypeDescriptor.getJavaTypeName() == null ) {
|
|
||||||
hibernateTypeDescriptor.setJavaTypeName( defaultJavaTypeName );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bindExplicitHibernateTypeDescriptor(
|
|
||||||
hibernateTypeDescriptor, explicitTypeSource.getName(), explicitTypeSource.getParameters()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void bindIdentifier( final EntityBinding rootEntityBinding, final IdentifierSource identifierSource ) {
|
private void bindIdentifier( final EntityBinding rootEntityBinding, final IdentifierSource identifierSource ) {
|
||||||
@ -752,9 +770,11 @@ private ManyToOneAttributeBinding bindManyToOneAttribute(
|
|||||||
attributeSource,
|
attributeSource,
|
||||||
attribute,
|
attribute,
|
||||||
attributeBindingContainer.seekEntityBinding().getPrimaryTable() );
|
attributeBindingContainer.seekEntityBinding().getPrimaryTable() );
|
||||||
|
org.hibernate.internal.util.Value<Class<?>> referencedJavaTypeValue =
|
||||||
|
createSingularAttributeJavaType( attribute );
|
||||||
final String referencedEntityName = attributeSource.getReferencedEntityName() != null
|
final String referencedEntityName = attributeSource.getReferencedEntityName() != null
|
||||||
? attributeSource.getReferencedEntityName()
|
? attributeSource.getReferencedEntityName()
|
||||||
: determineJavaType( attribute ).getName();
|
: referencedJavaTypeValue.getValue().getName();
|
||||||
final EntityBinding referencedEntityBinding = entityBinding( referencedEntityName );
|
final EntityBinding referencedEntityBinding = entityBinding( referencedEntityName );
|
||||||
final AttributeBinding referencedAttributeBinding =
|
final AttributeBinding referencedAttributeBinding =
|
||||||
attributeSource.getReferencedEntityAttributeName() == null
|
attributeSource.getReferencedEntityAttributeName() == null
|
||||||
@ -786,8 +806,9 @@ private ManyToOneAttributeBinding bindManyToOneAttribute(
|
|||||||
);
|
);
|
||||||
// TODO: need to be able to deal with composite IDs
|
// TODO: need to be able to deal with composite IDs
|
||||||
bindHibernateTypeDescriptor(
|
bindHibernateTypeDescriptor(
|
||||||
attributeBinding,
|
attributeBinding.getHibernateTypeDescriptor(),
|
||||||
attributeSource.getTypeInformation()
|
attributeSource.getTypeInformation(),
|
||||||
|
referencedJavaTypeValue
|
||||||
);
|
);
|
||||||
resolveHibernateResolvedType( attributeBinding.getHibernateTypeDescriptor(), resolvedType );
|
resolveHibernateResolvedType( attributeBinding.getHibernateTypeDescriptor(), resolvedType );
|
||||||
resolveJdbcDataType( resolvedType, (AbstractValue) relationalValueBindings.get( 0 ).getValue() );
|
resolveJdbcDataType( resolvedType, (AbstractValue) relationalValueBindings.get( 0 ).getValue() );
|
||||||
|
@ -123,35 +123,7 @@ public void bindSingularAttributeTypeInformation(
|
|||||||
|
|
||||||
public ReflectedCollectionJavaTypes getReflectedCollectionJavaTypes(
|
public ReflectedCollectionJavaTypes getReflectedCollectionJavaTypes(
|
||||||
PluralAttributeBinding attributeBinding) {
|
PluralAttributeBinding attributeBinding) {
|
||||||
final ReflectedCollectionJavaTypes reflectedCollectionJavaTypes = determineJavaType( attributeBinding.getAttribute() );
|
return determineJavaType( attributeBinding.getAttribute() );
|
||||||
|
|
||||||
if ( reflectedCollectionJavaTypes != null ) {
|
|
||||||
if ( reflectedCollectionJavaTypes.collectionType != null ) {
|
|
||||||
if ( attributeBinding.getHibernateTypeDescriptor().getJavaTypeName() == null ) {
|
|
||||||
attributeBinding.getHibernateTypeDescriptor().setJavaTypeName(
|
|
||||||
reflectedCollectionJavaTypes.collectionType.getName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( reflectedCollectionJavaTypes.collectionElementType != null ) {
|
|
||||||
if ( attributeBinding.getPluralAttributeElementBinding().getHibernateTypeDescriptor().getJavaTypeName() == null ) {
|
|
||||||
attributeBinding.getPluralAttributeElementBinding().getHibernateTypeDescriptor().setJavaTypeName(
|
|
||||||
reflectedCollectionJavaTypes.collectionElementType.getName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( reflectedCollectionJavaTypes.collectionIndexType != null
|
|
||||||
&& IndexedPluralAttributeBinding.class.isInstance( attributeBinding ) ) {
|
|
||||||
final PluralAttributeIndexBinding indexBinding
|
|
||||||
= ( (IndexedPluralAttributeBinding) attributeBinding ).getPluralAttributeIndexBinding();
|
|
||||||
if ( indexBinding.getHibernateTypeDescriptor().getJavaTypeName() == null ) {
|
|
||||||
indexBinding.getHibernateTypeDescriptor().setJavaTypeName(
|
|
||||||
reflectedCollectionJavaTypes.collectionIndexType.getName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return reflectedCollectionJavaTypes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Class<?> determineJavaType(final SingularAttribute attribute) {
|
private Class<?> determineJavaType(final SingularAttribute attribute) {
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
<set name="thePropertyRefSet">
|
<set name="thePropertyRefSet">
|
||||||
<key column="pid" property-ref="name"/>
|
<key column="pid" property-ref="name"/>
|
||||||
<element column="property_ref_set_stuff" type="Integer"/>
|
<element column="property_ref_set_stuff" type="integer"/>
|
||||||
</set>
|
</set>
|
||||||
|
|
||||||
</class>
|
</class>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user