diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractDynamicMapInstantiator.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractDynamicMapInstantiator.java index 4eefbe95d09e..1286963915c5 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractDynamicMapInstantiator.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractDynamicMapInstantiator.java @@ -21,7 +21,7 @@ public abstract class AbstractDynamicMapInstantiator implements Instantiator { public AbstractDynamicMapInstantiator(String roleName) { if ( roleName == null ) { - throw new IllegalArgumentException( "`roleName` passed to dynamic-map instantiator cannot be null" ); + throw new IllegalArgumentException( "Role name passed to dynamic map instantiator cannot be null" ); } this.roleName = roleName; } @@ -32,12 +32,9 @@ public String getRoleName() { @Override public boolean isInstance(Object object) { - if ( object instanceof Map map ) { - return isSameRole( (String) map.get( TYPE_KEY ) ); - } - - // todo (6.0) : should this be an exception instead? - return false; + return object instanceof Map map + && isSameRole( (String) map.get( TYPE_KEY ) ); + // todo (6.0) : should this be an exception if there is no TYPE_KEY } protected boolean isSameRole(String type) { @@ -49,10 +46,8 @@ public boolean isSameClass(Object object) { return isInstance( object ); } - @SuppressWarnings("rawtypes") - protected Map generateDataMap() { - final Map map = new HashMap(); - //noinspection unchecked + protected Map generateDataMap() { + final Map map = new HashMap<>(); map.put( TYPE_KEY, roleName ); return map; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java index 20ca11ac9d41..0f11fe51bf67 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractEntityInstantiatorPojo.java @@ -6,7 +6,6 @@ import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor; -import org.hibernate.engine.spi.PersistentAttributeInterceptor; import org.hibernate.mapping.PersistentClass; import org.hibernate.metamodel.spi.EntityInstantiator; import org.hibernate.tuple.entity.EntityMetamodel; @@ -30,28 +29,25 @@ public AbstractEntityInstantiatorPojo( PersistentClass persistentClass, JavaType javaType) { super( javaType.getJavaTypeClass() ); - this.entityMetamodel = entityMetamodel; this.proxyInterface = persistentClass.getProxyInterface(); - //TODO this PojoEntityInstantiator appears to not be reused ?! - this.applyBytecodeInterception = isPersistentAttributeInterceptableType( persistentClass.getMappedClass() ); + this.applyBytecodeInterception = + isPersistentAttributeInterceptableType( persistentClass.getMappedClass() ); } protected Object applyInterception(Object entity) { - if ( !applyBytecodeInterception ) { - return entity; + if ( applyBytecodeInterception ) { + asPersistentAttributeInterceptable( entity ) + .$$_hibernate_setInterceptor( new LazyAttributeLoadingInterceptor( + entityMetamodel.getName(), + null, + entityMetamodel.getBytecodeEnhancementMetadata() + .getLazyAttributesMetadata() + .getLazyAttributeNames(), + null + ) ); } - - PersistentAttributeInterceptor interceptor = new LazyAttributeLoadingInterceptor( - entityMetamodel.getName(), - null, - entityMetamodel.getBytecodeEnhancementMetadata() - .getLazyAttributesMetadata() - .getLazyAttributeNames(), - null - ); - asPersistentAttributeInterceptable( entity ).$$_hibernate_setInterceptor( interceptor ); return entity; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractPojoInstantiator.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractPojoInstantiator.java index 032c923f543c..b24c04d33ce4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractPojoInstantiator.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AbstractPojoInstantiator.java @@ -4,9 +4,10 @@ */ package org.hibernate.metamodel.internal; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.metamodel.spi.Instantiator; +import static org.hibernate.internal.util.ReflectHelper.isAbstractClass; + /** * Base support for POJO-based instantiation * @@ -18,7 +19,7 @@ public abstract class AbstractPojoInstantiator implements Instantiator { public AbstractPojoInstantiator(Class mappedPojoClass) { this.mappedPojoClass = mappedPojoClass; - this.isAbstract = ReflectHelper.isAbstractClass( mappedPojoClass ); + this.isAbstract = isAbstractClass( mappedPojoClass ); } public Class getMappedPojoClass() { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java index 99760617a2c5..95bee64d63e7 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java @@ -461,8 +461,7 @@ private static AttributeMetadata determineAttributeMetadata( propertyMapping, attributeContext.getOwnerType(), member, - AttributeClassification.ANY, - context + AttributeClassification.ANY ); } else if ( type instanceof EntityType ) { @@ -471,8 +470,7 @@ else if ( type instanceof EntityType ) { propertyMapping, attributeContext.getOwnerType(), member, - determineSingularAssociationClassification( member ), - context + determineSingularAssociationClassification( member ) ); } else if ( type instanceof CollectionType ) { @@ -486,8 +484,7 @@ else if ( type instanceof CollectionType ) { member, collectionClassification( elementType, isManyToMany ), elementClassification( elementType, isManyToMany ), - indexClassification( value ), - context + indexClassification( value ) ); } else if ( value instanceof OneToMany ) { @@ -516,8 +513,7 @@ else if ( type instanceof ComponentType ) { propertyMapping, attributeContext.getOwnerType(), member, - AttributeClassification.EMBEDDED, - context + AttributeClassification.EMBEDDED ); } else { @@ -527,8 +523,7 @@ else if ( type instanceof ComponentType ) { propertyMapping, attributeContext.getOwnerType(), member, - AttributeClassification.BASIC, - context + AttributeClassification.BASIC ); } throw new UnsupportedMappingException( "oops, we are missing something: " + propertyMapping ); @@ -557,9 +552,9 @@ else if ( elementType instanceof ComponentType ) { return AttributeClassification.EMBEDDED; } else if ( elementType instanceof EntityType ) { - return isManyToMany ? - AttributeClassification.MANY_TO_MANY : - AttributeClassification.ONE_TO_MANY; + return isManyToMany + ? AttributeClassification.MANY_TO_MANY + : AttributeClassification.ONE_TO_MANY; } else { return AttributeClassification.BASIC; @@ -569,9 +564,9 @@ else if ( elementType instanceof EntityType ) { private static AttributeClassification collectionClassification( org.hibernate.type.Type elementType, boolean isManyToMany) { if ( elementType instanceof EntityType ) { - return isManyToMany ? - AttributeClassification.MANY_TO_MANY : - AttributeClassification.ONE_TO_MANY; + return isManyToMany + ? AttributeClassification.MANY_TO_MANY + : AttributeClassification.ONE_TO_MANY; } else { return AttributeClassification.ELEMENT_COLLECTION; @@ -680,7 +675,7 @@ private static EmbeddableRepresentationStrategy ownerRepresentationStrategy( return ownerBootDescriptor.getBuildingContext() .getBootstrapContext() .getRepresentationStrategySelector() - .resolveStrategy(ownerBootDescriptor, null, + .resolveStrategy( ownerBootDescriptor, null, metadataContext.getRuntimeModelCreationContext() ); } else { @@ -728,66 +723,49 @@ private static Member resolveVirtualIdentifierMember( Property property, EntityP final ManagedDomainType ownerType = attributeContext.getOwnerType(); final Property property = attributeContext.getPropertyMapping(); final Type.PersistenceType persistenceType = ownerType.getPersistenceType(); - if ( Type.PersistenceType.EMBEDDABLE == persistenceType ) { - return embeddedMemberResolver.resolveMember( attributeContext, metadataContext ); - } - else if ( Type.PersistenceType.MAPPED_SUPERCLASS == persistenceType ) { - return resolveMappedSuperclassMember( - property, - (MappedSuperclassDomainType) ownerType, - metadataContext - ); - } - else if ( Type.PersistenceType.ENTITY == persistenceType ) { - return resolveEntityMember( property, getDeclaringEntity( (AbstractIdentifiableType) ownerType, metadataContext ) ); - } - else { - throw new IllegalArgumentException( "Unexpected owner type : " + persistenceType ); - } + return switch ( persistenceType ) { + case ENTITY -> + resolveEntityMember( property, + getDeclaringEntity( (AbstractIdentifiableType) ownerType, metadataContext ) ); + case MAPPED_SUPERCLASS -> + resolveMappedSuperclassMember( property, (MappedSuperclassDomainType) ownerType, metadataContext ); + case EMBEDDABLE -> + embeddedMemberResolver.resolveMember( attributeContext, metadataContext ); + default -> throw new IllegalArgumentException( "Unexpected owner type : " + persistenceType ); + }; }; private static Member resolveEntityMember(Property property, EntityPersister declaringEntity) { final String propertyName = property.getName(); final AttributeMapping attributeMapping = declaringEntity.findAttributeMapping( propertyName ); - if ( attributeMapping == null ) { - // just like in #determineIdentifierJavaMember , this *should* indicate we have an IdClass mapping - return resolveVirtualIdentifierMember( property, declaringEntity ); - } - else { - final Getter getter = getter( declaringEntity, property ); - return getter instanceof PropertyAccessMapImpl.GetterImpl - ? new MapMember( propertyName, property.getType().getReturnedClass() ) - : getter.getMember(); - } + return attributeMapping == null + // just like in #determineIdentifierJavaMember , this *should* indicate we have an IdClass mapping + ? resolveVirtualIdentifierMember( property, declaringEntity ) + : getter( declaringEntity, property, propertyName, property.getType().getReturnedClass() ); } private static Member resolveMappedSuperclassMember( Property property, MappedSuperclassDomainType ownerType, - MetadataContext metadataContext) { - final EntityPersister declaringEntity = getDeclaringEntity( (AbstractIdentifiableType) ownerType, metadataContext ); + MetadataContext context) { + final EntityPersister declaringEntity = + getDeclaringEntity( (AbstractIdentifiableType) ownerType, context ); if ( declaringEntity != null ) { return resolveEntityMember( property, declaringEntity ); } else { final ManagedDomainType subType = ownerType.getSubTypes().iterator().next(); final Type.PersistenceType persistenceType = subType.getPersistenceType(); - if ( persistenceType == Type.PersistenceType.ENTITY ) { - return resolveEntityMember( property, getDeclaringEntity( (AbstractIdentifiableType) subType, metadataContext ) ); - } - else if ( persistenceType == Type.PersistenceType.EMBEDDABLE ) { - return resolveEmbeddedMember( property, (EmbeddableDomainType) subType, metadataContext ); - } - else if ( persistenceType == Type.PersistenceType.MAPPED_SUPERCLASS ) { - return resolveMappedSuperclassMember( - property, - (MappedSuperclassDomainType) subType, - metadataContext - ); - } - else { - throw new IllegalArgumentException( "Unexpected subtype: " + persistenceType ); - } + return switch ( persistenceType ) { + case ENTITY -> + resolveEntityMember( property, + getDeclaringEntity( (AbstractIdentifiableType) subType, context ) ); + case MAPPED_SUPERCLASS -> + resolveMappedSuperclassMember( property, (MappedSuperclassDomainType) subType, context ); + case EMBEDDABLE -> + resolveEmbeddedMember( property, (EmbeddableDomainType) subType, context ); + default -> throw new IllegalArgumentException( "Unexpected PersistenceType: " + persistenceType ); + }; } } @@ -797,18 +775,12 @@ else if ( persistenceType == Type.PersistenceType.MAPPED_SUPERCLASS ) { final EntityPersister declaringEntityMapping = getDeclaringEntity( identifiableType, metadataContext ); final EntityIdentifierMapping identifierMapping = declaringEntityMapping.getIdentifierMapping(); final Property propertyMapping = attributeContext.getPropertyMapping(); - if ( !propertyMapping.getName().equals( identifierMapping.getAttributeName() ) ) { - // this *should* indicate processing part of an IdClass... - return virtualIdentifierMemberResolver.resolveMember( attributeContext, metadataContext ); - } + return !propertyMapping.getName().equals( identifierMapping.getAttributeName() ) + // this *should* indicate processing part of an IdClass... + ? virtualIdentifierMemberResolver.resolveMember( attributeContext, metadataContext ) + : getter( declaringEntityMapping, propertyMapping, + identifierMapping.getAttributeName(), identifierMapping.getJavaType().getJavaTypeClass() ); - final Getter getter = getter( declaringEntityMapping, propertyMapping ); - if ( getter instanceof PropertyAccessMapImpl.GetterImpl ) { - return new MapMember( identifierMapping.getAttributeName(), identifierMapping.getJavaType().getJavaTypeClass() ); - } - else { - return getter.getMember(); - } }; private final MemberResolver versionMemberResolver = (attributeContext, metadataContext) -> { @@ -824,20 +796,20 @@ else if ( persistenceType == Type.PersistenceType.MAPPED_SUPERCLASS ) { // this should never happen, but to be safe... throw new IllegalArgumentException( "Given property did not match declared version property" ); } - - final Getter getter = getter( entityPersister, attributeContext.getPropertyMapping() ); - if ( getter instanceof PropertyAccessMapImpl.GetterImpl ) { - return new MapMember( versionPropertyName, versionMapping.getJavaType().getJavaTypeClass() ); - } - else { - return getter.getMember(); - } + return getter( entityPersister, attributeContext.getPropertyMapping(), + versionPropertyName, versionMapping.getJavaType().getJavaTypeClass() ); }; - private static Getter getter(EntityPersister declaringEntityMapping, Property propertyMapping) { - return declaringEntityMapping.getRepresentationStrategy() - .resolvePropertyAccess( propertyMapping ) - .getGetter(); + private static Member getter(EntityPersister persister, Property property, String name, Class type) { + final Getter getter = getter( persister, property ); + return getter instanceof PropertyAccessMapImpl.GetterImpl + ? new MapMember( name, type ) + : getter.getMember(); } + private static Getter getter(EntityPersister persister, Property property) { + return persister.getRepresentationStrategy() + .resolvePropertyAccess( property ) + .getGetter(); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/BaseAttributeMetadata.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/BaseAttributeMetadata.java index 4a89463ff75c..1a2194840a20 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/BaseAttributeMetadata.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/BaseAttributeMetadata.java @@ -28,8 +28,7 @@ protected BaseAttributeMetadata( Property propertyMapping, ManagedDomainType ownerType, Member member, - AttributeClassification attributeClassification, - MetadataContext metadataContext) { + AttributeClassification attributeClassification) { this.propertyMapping = propertyMapping; this.ownerType = ownerType; this.member = member; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableHelper.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableHelper.java index 8005fbf34d8a..f5a8412d04a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableHelper.java @@ -26,7 +26,6 @@ public static boolean resolveIndex(String[] sortedComponentNames, String[] compo index[i] = newIndex; hasGaps = hasGaps || newIndex < 0; } - return hasGaps; } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java index 7109f8de4958..50571236f29e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java @@ -31,13 +31,11 @@ public EmbeddableInstantiatorDynamicMap( @Override public Object instantiate(ValueAccess valuesAccess) { final Map dataMap = generateDataMap(); - - Object[] values = valuesAccess == null ? null : valuesAccess.getValues(); + final Object[] values = valuesAccess == null ? null : valuesAccess.getValues(); if ( values != null ) { final EmbeddableMappingType mappingType = runtimeDescriptorAccess.get(); mappingType.setValues( dataMap, values ); } - return dataMap; } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java index 486f6dfac625..46742a2fbf4a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java @@ -31,12 +31,9 @@ public static EmbeddableInstantiatorPojoIndirecting of( throw new IllegalArgumentException( "Can't determine field assignment for constructor: " + constructor ); } final int[] index = new int[componentNames.length]; - if ( EmbeddableHelper.resolveIndex( propertyNames, componentNames, index ) ) { - return new EmbeddableInstantiatorPojoIndirecting.EmbeddableInstantiatorPojoIndirectingWithGap( constructor, index ); - } - else { - return new EmbeddableInstantiatorPojoIndirecting( constructor, index ); - } + return EmbeddableHelper.resolveIndex( propertyNames, componentNames, index ) + ? new EmbeddableInstantiatorPojoIndirectingWithGap( constructor, index ) + : new EmbeddableInstantiatorPojoIndirecting( constructor, index ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java index 26979dd6ae53..3970ff4b63ca 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java @@ -11,35 +11,34 @@ import org.hibernate.PropertyNotFoundException; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.metamodel.mapping.EmbeddableMappingType; import org.hibernate.metamodel.spi.ValueAccess; +import static org.hibernate.internal.util.ReflectHelper.getDefaultConstructor; + /** * Support for instantiating embeddables as POJO representation */ public class EmbeddableInstantiatorPojoStandard extends AbstractPojoInstantiator implements StandardEmbeddableInstantiator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PojoInstantiatorImpl.class ); + private static final CoreMessageLogger LOG = CoreLogging.messageLogger( EmbeddableInstantiatorPojoStandard.class ); private final Supplier embeddableMappingAccess; private final Constructor constructor; public EmbeddableInstantiatorPojoStandard(Class embeddableClass, Supplier embeddableMappingAccess) { super( embeddableClass ); - this.embeddableMappingAccess = embeddableMappingAccess; this.constructor = resolveConstructor( embeddableClass ); } protected static Constructor resolveConstructor(Class mappedPojoClass) { try { - return ReflectHelper.getDefaultConstructor( mappedPojoClass ); + return getDefaultConstructor( mappedPojoClass ); } catch ( PropertyNotFoundException e ) { LOG.noDefaultConstructor( mappedPojoClass.getName() ); + return null; } - - return null; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorProxied.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorProxied.java index fc68331677ad..011b869aa113 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorProxied.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorProxied.java @@ -20,7 +20,8 @@ public class EmbeddableInstantiatorProxied implements StandardEmbeddableInstanti public EmbeddableInstantiatorProxied( Class proxiedClass, - Supplier embeddableMappingAccess, BasicProxyFactory factory) { + Supplier embeddableMappingAccess, + BasicProxyFactory factory) { this.proxiedClass = proxiedClass; this.embeddableMappingAccess = embeddableMappingAccess; this.factory = factory; @@ -29,10 +30,9 @@ public EmbeddableInstantiatorProxied( @Override public Object instantiate(ValueAccess valuesAccess) { final Object proxy = factory.getProxy(); - Object[] values = valuesAccess == null ? null : valuesAccess.getValues(); + final Object[] values = valuesAccess == null ? null : valuesAccess.getValues(); if ( values != null ) { - final EmbeddableMappingType embeddableMapping = embeddableMappingAccess.get(); - embeddableMapping.setValues( proxy, values ); + embeddableMappingAccess.get().setValues( proxy, values ); } return proxy; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java index 1359af47cc6b..dbc94afe9720 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java @@ -5,9 +5,10 @@ package org.hibernate.metamodel.internal; import org.hibernate.InstantiationException; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.metamodel.spi.ValueAccess; +import static org.hibernate.internal.util.ReflectHelper.getRecordComponentNames; + /** * Support for instantiating embeddables as record representation */ @@ -21,14 +22,11 @@ public EmbeddableInstantiatorRecordIndirecting(Class javaType, int[] index) { } public static EmbeddableInstantiatorRecordIndirecting of(Class javaType, String[] propertyNames) { - final String[] componentNames = ReflectHelper.getRecordComponentNames( javaType ); + final String[] componentNames = getRecordComponentNames( javaType ); final int[] index = new int[componentNames.length]; - if ( EmbeddableHelper.resolveIndex( propertyNames, componentNames, index ) ) { - return new EmbeddableInstantiatorRecordIndirectingWithGap( javaType, index ); - } - else { - return new EmbeddableInstantiatorRecordIndirecting(javaType, index); - } + return EmbeddableHelper.resolveIndex( propertyNames, componentNames, index ) + ? new EmbeddableInstantiatorRecordIndirectingWithGap( javaType, index ) + : new EmbeddableInstantiatorRecordIndirecting( javaType, index ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordStandard.java index 810f4d23e15f..b0fd204a0078 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordStandard.java @@ -7,10 +7,12 @@ import java.lang.reflect.Constructor; import org.hibernate.InstantiationException; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.metamodel.spi.EmbeddableInstantiator; import org.hibernate.metamodel.spi.ValueAccess; +import static org.hibernate.internal.util.ReflectHelper.getConstructorOrNull; +import static org.hibernate.internal.util.ReflectHelper.getRecordComponentTypes; + /** * Support for instantiating embeddables as record representation */ @@ -20,9 +22,8 @@ public class EmbeddableInstantiatorRecordStandard extends AbstractPojoInstantiat public EmbeddableInstantiatorRecordStandard(Class javaType) { super( javaType ); - - final Class[] componentTypes = ReflectHelper.getRecordComponentTypes( javaType ); - this.constructor = ReflectHelper.getConstructorOrNull( javaType, componentTypes ); + final Class[] componentTypes = getRecordComponentTypes( javaType ); + this.constructor = getConstructorOrNull( javaType, componentTypes ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyMap.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyMap.java index 5f791be3050a..f1bdd40de761 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyMap.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyMap.java @@ -23,7 +23,7 @@ * @author Steve Ebersole */ public class EmbeddableRepresentationStrategyMap implements EmbeddableRepresentationStrategy { - private final JavaType mapJtd; + private final JavaType> mapJavaType; private final EmbeddableInstantiator instantiator; public EmbeddableRepresentationStrategyMap( @@ -31,7 +31,7 @@ public EmbeddableRepresentationStrategyMap( Supplier runtimeDescriptorAccess, EmbeddableInstantiator customInstantiator, RuntimeModelCreationContext creationContext) { - this.mapJtd = creationContext.getTypeConfiguration().getJavaTypeRegistry().getDescriptor( Map.class ); + this.mapJavaType = creationContext.getTypeConfiguration().getJavaTypeRegistry().getDescriptor( Map.class ); this.instantiator = customInstantiator != null ? customInstantiator : new EmbeddableInstantiatorDynamicMap( bootDescriptor, runtimeDescriptorAccess ); @@ -49,7 +49,7 @@ public ReflectionOptimizer getReflectionOptimizer() { @Override public JavaType getMappedJavaType() { - return mapJtd; + return mapJavaType; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java index 336747d989a5..2be2b0a20eba 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java @@ -17,8 +17,6 @@ import org.hibernate.bytecode.spi.BytecodeProvider; import org.hibernate.bytecode.spi.ProxyFactoryFactory; import org.hibernate.bytecode.spi.ReflectionOptimizer; -import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.internal.util.StringHelper; import org.hibernate.mapping.Backref; import org.hibernate.mapping.Component; import org.hibernate.mapping.IndexBackref; @@ -39,6 +37,8 @@ import org.hibernate.usertype.CompositeUserType; import static org.hibernate.internal.util.NullnessUtil.castNonNull; +import static org.hibernate.internal.util.ReflectHelper.isAbstractClass; +import static org.hibernate.internal.util.StringHelper.isNotEmpty; /** * @author Steve Ebersole @@ -72,8 +72,8 @@ public EmbeddableRepresentationStrategyPojo( for ( int i = 0; i < bootDescriptor.getProperties().size(); i++ ) { final Property property = bootDescriptor.getProperty( i ); final Class embeddableClass; - if ( bootDescriptor.isPolymorphic() ) { - final Class subclass = castNonNull( subclassesByName ).get( bootDescriptor.getPropertyDeclaringClass( property ) ); + if ( subclassesByName != null ) { + final Class subclass = subclassesByName.get( bootDescriptor.getPropertyDeclaringClass( property ) ); embeddableClass = subclass != null ? subclass : getEmbeddableJavaType().getJavaTypeClass(); } else { @@ -137,10 +137,12 @@ private static JavaType resolveEmbeddableJavaType( if ( compositeUserType == null ) { return javaTypeRegistry.resolveDescriptor( bootDescriptor.getComponentClass() ); } - return javaTypeRegistry.resolveDescriptor( - compositeUserType.returnedClass(), - () -> new CompositeUserTypeJavaTypeWrapper<>( compositeUserType ) - ); + else { + return javaTypeRegistry.resolveDescriptor( + compositeUserType.returnedClass(), + () -> new CompositeUserTypeJavaTypeWrapper<>( compositeUserType ) + ); + } } private static EmbeddableInstantiator determineInstantiator( @@ -150,20 +152,18 @@ private static EmbeddableInstantiator determineInstantiator( Supplier runtimeDescriptorAccess, RuntimeModelCreationContext creationContext) { if ( reflectionOptimizer != null && reflectionOptimizer.getInstantiationOptimizer() != null ) { - final ReflectionOptimizer.InstantiationOptimizer instantiationOptimizer = reflectionOptimizer.getInstantiationOptimizer(); return new EmbeddableInstantiatorPojoOptimized( embeddableClass, runtimeDescriptorAccess, - instantiationOptimizer + reflectionOptimizer.getInstantiationOptimizer() ); } - if ( bootDescriptor.isEmbedded() && ReflectHelper.isAbstractClass( embeddableClass ) ) { + if ( bootDescriptor.isEmbedded() && isAbstractClass( embeddableClass ) ) { return new EmbeddableInstantiatorProxied( embeddableClass, runtimeDescriptorAccess, - creationContext.getServiceRegistry() - .requireService( ProxyFactoryFactory.class ) + getProxyFactoryFactory( creationContext ) .buildBasicProxyFactory( embeddableClass ) ); } @@ -171,6 +171,11 @@ private static EmbeddableInstantiator determineInstantiator( return new EmbeddableInstantiatorPojoStandard( embeddableClass, runtimeDescriptorAccess ); } + private static ProxyFactoryFactory getProxyFactoryFactory(RuntimeModelCreationContext creationContext) { + return creationContext.getServiceRegistry() + .requireService( ProxyFactoryFactory.class ); + } + private PropertyAccess buildPropertyAccess( Property bootAttributeDescriptor, Class embeddableClass, @@ -179,7 +184,7 @@ private PropertyAccess buildPropertyAccess( if ( strategy == null ) { final String propertyAccessorName = bootAttributeDescriptor.getPropertyAccessorName(); - if ( StringHelper.isNotEmpty( propertyAccessorName ) ) { + if ( isNotEmpty( propertyAccessorName ) ) { // handle explicitly specified attribute accessor strategy = strategySelector.resolveStrategy( @@ -189,8 +194,10 @@ private PropertyAccess buildPropertyAccess( } else { if ( bootAttributeDescriptor instanceof Backref backref ) { - strategy = new PropertyAccessStrategyBackRefImpl( backref.getCollectionRole(), backref - .getEntityName() ); + strategy = new PropertyAccessStrategyBackRefImpl( + backref.getCollectionRole(), + backref.getEntityName() + ); } else if ( bootAttributeDescriptor instanceof IndexBackref indexBackref ) { strategy = new PropertyAccessStrategyIndexBackRefImpl( @@ -228,21 +235,24 @@ private static ReflectionOptimizer buildReflectionOptimizer( boolean hasCustomAccessors, PropertyAccess[] propertyAccesses, RuntimeModelCreationContext creationContext) { - if ( hasCustomAccessors || bootDescriptor.getCustomInstantiator() != null || bootDescriptor.getInstantiator() != null || bootDescriptor.isPolymorphic() ) { - return null; + if ( !hasCustomAccessors + && bootDescriptor.getCustomInstantiator() == null + && bootDescriptor.getInstantiator() == null + && !bootDescriptor.isPolymorphic() ) { + final Map propertyAccessMap = new LinkedHashMap<>(); + int i = 0; + for ( Property property : bootDescriptor.getProperties() ) { + propertyAccessMap.put( property.getName(), propertyAccesses[i] ); + i++; + } + return creationContext.getServiceRegistry() + .requireService( BytecodeProvider.class ) + .getReflectionOptimizer( bootDescriptor.getComponentClass(), propertyAccessMap ); } - - final Map propertyAccessMap = new LinkedHashMap<>(); - - int i = 0; - for ( Property property : bootDescriptor.getProperties() ) { - propertyAccessMap.put( property.getName(), propertyAccesses[i] ); - i++; + else { + return null; } - return creationContext.getServiceRegistry() - .requireService( BytecodeProvider.class ) - .getReflectionOptimizer( bootDescriptor.getComponentClass(), propertyAccessMap ); } private static Map> getSubclassesByName( @@ -253,13 +263,10 @@ private static Map> getSubclassesByName( final Map> result = new HashMap<>( subclassNames.size() ); final ClassLoaderService classLoaderService = creationContext.getBootstrapContext().getClassLoaderService(); for ( final String subclassName : subclassNames ) { - final Class embeddableClass; - if ( subclassName.equals( bootDescriptor.getComponentClassName() ) ) { - embeddableClass = bootDescriptor.getComponentClass(); - } - else { - embeddableClass = classLoaderService.classForName( subclassName ); - } + final Class embeddableClass = + subclassName.equals( bootDescriptor.getComponentClassName() ) + ? bootDescriptor.getComponentClass() + : classLoaderService.classForName( subclassName ); result.put( subclassName, embeddableClass ); } return result; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorDynamicMap.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorDynamicMap.java index 2c1692bee994..b97f20a0e422 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorDynamicMap.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorDynamicMap.java @@ -25,7 +25,6 @@ public class EntityInstantiatorDynamicMap public EntityInstantiatorDynamicMap(PersistentClass bootDescriptor) { super( bootDescriptor.getEntityName() ); - entityRoleNames.add( getRoleName() ); if ( bootDescriptor.hasSubclasses() ) { for ( PersistentClass subclassInfo : bootDescriptor.getSubclassClosure() ) { @@ -48,25 +47,19 @@ private boolean isPartOfHierarchy(String type) { return entityRoleNames.contains( type ); } - public static final EntityNameResolver ENTITY_NAME_RESOLVER = entity -> { - if ( ! (entity instanceof Map ) ) { - return null; - } - final String entityName = extractEmbeddedEntityName( (Map) entity ); - if ( entityName == null ) { - throw new HibernateException( "Could not determine type of dynamic map entity" ); - } - return entityName; - }; + public static final EntityNameResolver ENTITY_NAME_RESOLVER = + entity -> entity instanceof Map map ? extractEmbeddedEntityName( map ) : null; public static String extractEmbeddedEntityName(Map entity) { if ( entity == null ) { - return null; - } - final String entityName = (String) entity.get( TYPE_KEY ); - if ( entityName == null ) { throw new HibernateException( "Could not determine type of dynamic map entity" ); } - return entityName; + else { + final String entityName = (String) entity.get( TYPE_KEY ); + if ( entityName == null ) { + throw new HibernateException( "Could not determine type of dynamic map entity" ); + } + return entityName; + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorPojoStandard.java index 7a1e9456654e..5bc1b8a7f8dc 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityInstantiatorPojoStandard.java @@ -11,13 +11,13 @@ import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.mapping.PersistentClass; import org.hibernate.tuple.entity.EntityMetamodel; import org.hibernate.type.descriptor.java.JavaType; import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable; import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType; +import static org.hibernate.internal.util.ReflectHelper.getDefaultConstructor; /** * Support for instantiating entity values as POJO representation @@ -44,7 +44,7 @@ public EntityInstantiatorPojoStandard( protected static Constructor resolveConstructor(Class mappedPojoClass) { try { - return ReflectHelper.getDefaultConstructor( mappedPojoClass); + return getDefaultConstructor( mappedPojoClass); } catch ( PropertyNotFoundException e ) { LOG.noDefaultConstructor( mappedPojoClass.getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyMap.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyMap.java index 04429cc2e53a..1673a3fa46c3 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyMap.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyMap.java @@ -30,7 +30,7 @@ public class EntityRepresentationStrategyMap implements EntityRepresentationStrategy { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( EntityRepresentationStrategyMap.class ); - private final JavaType mapJtd; + private final JavaType> mapJavaType; private final ProxyFactory proxyFactory; private final EntityInstantiatorDynamicMap instantiator; @@ -38,7 +38,7 @@ public class EntityRepresentationStrategyMap implements EntityRepresentationStra public EntityRepresentationStrategyMap( PersistentClass bootType, RuntimeModelCreationContext creationContext) { - this.mapJtd = creationContext.getTypeConfiguration() + this.mapJavaType = creationContext.getTypeConfiguration() .getJavaTypeRegistry() .getDescriptor( Map.class ); @@ -51,7 +51,6 @@ public EntityRepresentationStrategyMap( private static ProxyFactory createProxyFactory(PersistentClass bootType) { try { ProxyFactory proxyFactory = new MapProxyFactory(); - proxyFactory.postInstantiate( bootType.getEntityName(), null, @@ -60,7 +59,6 @@ private static ProxyFactory createProxyFactory(PersistentClass bootType) { null, null ); - return proxyFactory; } catch (HibernateException he) { @@ -99,7 +97,7 @@ public ProxyFactory getProxyFactory() { @Override public JavaType getMappedJavaType() { - return mapJtd; + return mapJavaType; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java index 470f76a02c4c..576d586c60d4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java @@ -15,11 +15,8 @@ import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.bytecode.spi.BytecodeProvider; import org.hibernate.bytecode.spi.ReflectionOptimizer; -import org.hibernate.bytecode.spi.ReflectionOptimizer.InstantiationOptimizer; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.internal.util.StringHelper; import org.hibernate.mapping.Backref; import org.hibernate.mapping.Component; import org.hibernate.mapping.IndexBackref; @@ -39,7 +36,6 @@ import org.hibernate.property.access.spi.PropertyAccessStrategy; import org.hibernate.proxy.HibernateProxy; import org.hibernate.proxy.ProxyFactory; -import org.hibernate.proxy.pojo.ProxyFactoryHelper; import org.hibernate.tuple.entity.EntityMetamodel; import org.hibernate.type.CompositeType; import org.hibernate.type.descriptor.java.JavaType; @@ -47,6 +43,9 @@ import org.hibernate.type.spi.CompositeTypeImplementor; import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptableType; +import static org.hibernate.internal.util.ReflectHelper.getMethod; +import static org.hibernate.internal.util.StringHelper.isNotEmpty; +import static org.hibernate.proxy.pojo.ProxyFactoryHelper.validateGetterSetterMethodProxyability; /** * @author Steve Ebersole @@ -80,12 +79,7 @@ public EntityRepresentationStrategyPojoStandard( this.mappedJtd = jtdRegistry.resolveEntityTypeDescriptor( mappedJavaType ); final Class proxyJavaType = bootDescriptor.getProxyInterface(); - if ( proxyJavaType != null ) { - this.proxyJtd = jtdRegistry.getDescriptor( proxyJavaType ); - } - else { - this.proxyJtd = null; - } + this.proxyJtd = proxyJavaType != null ? jtdRegistry.getDescriptor( proxyJavaType ) : null; this.isBytecodeEnhanced = isPersistentAttributeInterceptableType( mappedJavaType ); @@ -96,10 +90,11 @@ public EntityRepresentationStrategyPojoStandard( final KeyValue bootDescriptorIdentifier = bootDescriptor.getIdentifier(); - if ( bootDescriptorIdentifier instanceof Component ) { - if ( bootDescriptor.getIdentifierMapper() != null ) { + if ( bootDescriptorIdentifier instanceof Component descriptorIdentifierComponent ) { + final Component identifierMapper = bootDescriptor.getIdentifierMapper(); + if ( identifierMapper != null ) { mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo( - bootDescriptor.getIdentifierMapper(), + identifierMapper, () -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() ) .getMappingModelPart().getEmbeddableTypeDescriptor(), // we currently do not support custom instantiators for identifiers @@ -108,9 +103,10 @@ public EntityRepresentationStrategyPojoStandard( creationContext ); } - else if ( bootDescriptorIdentifier != null ) { + else { mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo( - (Component) bootDescriptorIdentifier, + descriptorIdentifierComponent, + // TODO: something wrong here: bootDescriptor.getIdentifierMapper() was null! () -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() ) .getMappingModelPart().getEmbeddableTypeDescriptor(), // we currently do not support custom instantiators for identifiers @@ -119,9 +115,6 @@ else if ( bootDescriptorIdentifier != null ) { creationContext ); } - else { - mapsIdRepresentationStrategy = null; - } } else { mapsIdRepresentationStrategy = null; @@ -136,7 +129,8 @@ else if ( bootDescriptorIdentifier != null ) { this.strategySelector = creationContext.getServiceRegistry().getService( StrategySelector.class ); final BytecodeProvider bytecodeProvider = - creationContext.getBootstrapContext().getServiceRegistry().requireService( BytecodeProvider.class ); + creationContext.getBootstrapContext().getServiceRegistry() + .requireService( BytecodeProvider.class ); this.proxyFactory = resolveProxyFactory( bootDescriptor, @@ -192,16 +186,16 @@ private Map buildPropertyAccessMap(PersistentClass bootD private EntityInstantiator determineInstantiator(PersistentClass bootDescriptor, EntityMetamodel entityMetamodel) { if ( reflectionOptimizer != null && reflectionOptimizer.getInstantiationOptimizer() != null ) { - final InstantiationOptimizer instantiationOptimizer = reflectionOptimizer.getInstantiationOptimizer(); return new EntityInstantiatorPojoOptimized( entityMetamodel, bootDescriptor, mappedJtd, - instantiationOptimizer + reflectionOptimizer.getInstantiationOptimizer() ); } - - return new EntityInstantiatorPojoStandard( entityMetamodel, bootDescriptor, mappedJtd ); + else { + return new EntityInstantiatorPojoStandard( entityMetamodel, bootDescriptor, mappedJtd ); + } } private ProxyFactory createProxyFactory( @@ -216,13 +210,7 @@ private ProxyFactory createProxyFactory( final Set> proxyInterfaces = new java.util.LinkedHashSet<>(); final Class mappedClass = mappedJtd.getJavaTypeClass(); - Class proxyInterface; - if ( proxyJtd != null ) { - proxyInterface = proxyJtd.getJavaTypeClass(); - } - else { - proxyInterface = null; - } + final Class proxyInterface = proxyJtd != null ? proxyJtd.getJavaTypeClass() : null; if ( proxyInterface != null && ! mappedClass.equals( proxyInterface ) ) { if ( ! proxyInterface.isInterface() ) { @@ -252,31 +240,21 @@ private ProxyFactory createProxyFactory( proxyInterfaces.add( HibernateProxy.class ); - Class clazz = bootDescriptor.getMappedClass(); + final Class clazz = bootDescriptor.getMappedClass(); final Method idGetterMethod; final Method idSetterMethod; try { for ( Property property : bootDescriptor.getProperties() ) { - ProxyFactoryHelper.validateGetterSetterMethodProxyability( - "Getter", - property.getGetter( clazz ).getMethod() - ); - ProxyFactoryHelper.validateGetterSetterMethodProxyability( - "Setter", - property.getSetter( clazz ).getMethod() - ); + validateGetterSetterMethodProxyability( "Getter", + property.getGetter( clazz ).getMethod() ); + validateGetterSetterMethodProxyability( "Setter", + property.getSetter( clazz ).getMethod() ); } if ( identifierPropertyAccess != null ) { idGetterMethod = identifierPropertyAccess.getGetter().getMethod(); idSetterMethod = identifierPropertyAccess.getSetter().getMethod(); - ProxyFactoryHelper.validateGetterSetterMethodProxyability( - "Getter", - idGetterMethod - ); - ProxyFactoryHelper.validateGetterSetterMethodProxyability( - "Setter", - idSetterMethod - ); + validateGetterSetterMethodProxyability( "Getter", idGetterMethod ); + validateGetterSetterMethodProxyability( "Setter", idSetterMethod ); } else { idGetterMethod = null; @@ -288,15 +266,16 @@ private ProxyFactory createProxyFactory( return null; } - final Method proxyGetIdentifierMethod = idGetterMethod == null || proxyInterface == null - ? null - : ReflectHelper.getMethod( proxyInterface, idGetterMethod ); - final Method proxySetIdentifierMethod = idSetterMethod == null || proxyInterface == null - ? null - : ReflectHelper.getMethod( proxyInterface, idSetterMethod ); + final Method proxyGetIdentifierMethod = + idGetterMethod == null || proxyInterface == null ? null + : getMethod( proxyInterface, idGetterMethod ); + final Method proxySetIdentifierMethod = + idSetterMethod == null || proxyInterface == null ? null + : getMethod( proxyInterface, idSetterMethod ); - final ProxyFactory proxyFactory = bytecodeProvider.getProxyFactoryFactory() - .buildProxyFactory( creationContext.getSessionFactory() ); + final ProxyFactory proxyFactory = + bytecodeProvider.getProxyFactoryFactory() + .buildProxyFactory( creationContext.getSessionFactory() ); try { proxyFactory.postInstantiate( bootDescriptor.getEntityName(), @@ -304,9 +283,9 @@ private ProxyFactory createProxyFactory( proxyInterfaces, proxyGetIdentifierMethod, proxySetIdentifierMethod, - bootDescriptor.hasEmbeddedIdentifier() ? - (CompositeType) bootDescriptor.getIdentifier().getType() : - null + bootDescriptor.hasEmbeddedIdentifier() + ? (CompositeType) bootDescriptor.getIdentifier().getType() + : null ); return proxyFactory; @@ -329,7 +308,7 @@ private PropertyAccess makePropertyAccess(Property bootAttributeDescriptor) { if ( strategy == null ) { final String propertyAccessorName = bootAttributeDescriptor.getPropertyAccessorName(); - if ( StringHelper.isNotEmpty( propertyAccessorName ) ) { + if ( isNotEmpty( propertyAccessorName ) ) { // handle explicitly specified attribute accessor strategy = strategySelector.resolveStrategy( PropertyAccessStrategy.class, propertyAccessorName ); } @@ -406,7 +385,7 @@ public PropertyAccess resolvePropertyAccess(Property bootAttributeDescriptor) { return identifierPropertyAccess; } - PropertyAccess propertyAccess = propertyAccessMap.get( bootAttributeDescriptor.getName() ); + final PropertyAccess propertyAccess = propertyAccessMap.get( bootAttributeDescriptor.getName() ); if ( propertyAccess != null ) { return propertyAccess; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/FullNameImplicitDiscriminatorStrategy.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/FullNameImplicitDiscriminatorStrategy.java index 7f3b26a6691e..3120c77f689b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/FullNameImplicitDiscriminatorStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/FullNameImplicitDiscriminatorStrategy.java @@ -28,7 +28,6 @@ public Object toDiscriminatorValue(EntityMappingType entityMapping, NavigableRol public EntityMappingType toEntityMapping(Object discriminatorValue, NavigableRole discriminatorRole, MappingMetamodelImplementor mappingModel) { if ( discriminatorValue instanceof String assumedEntityName ) { final EntityPersister persister = mappingModel.findEntityDescriptor( assumedEntityName ); - if ( persister != null ) { return persister; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ManagedTypeRepresentationResolverStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ManagedTypeRepresentationResolverStandard.java index d3cc6d2d131e..04af39f10189 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ManagedTypeRepresentationResolverStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ManagedTypeRepresentationResolverStandard.java @@ -7,10 +7,8 @@ import java.util.function.Supplier; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.mapping.Component; import org.hibernate.mapping.PersistentClass; -import org.hibernate.metamodel.RepresentationMode; import org.hibernate.metamodel.mapping.EmbeddableMappingType; import org.hibernate.metamodel.spi.EmbeddableInstantiator; import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy; @@ -21,6 +19,8 @@ import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer; import org.hibernate.usertype.CompositeUserType; +import static org.hibernate.internal.util.ReflectHelper.isRecord; + /** * @author Steve Ebersole */ @@ -35,18 +35,7 @@ public EntityRepresentationStrategy resolveStrategy( PersistentClass bootDescriptor, EntityPersister runtimeDescriptor, RuntimeModelCreationContext creationContext) { -// RepresentationMode representation = bootDescriptor.getExplicitRepresentationMode(); - RepresentationMode representation = null; - if ( representation == null ) { - if ( bootDescriptor.getMappedClass() == null ) { - representation = RepresentationMode.MAP; - } - else { - representation = RepresentationMode.POJO; - } - } - - if ( representation == RepresentationMode.MAP ) { + if ( bootDescriptor.getMappedClass() == null ) { // i.e. RepresentationMode.MAP; return new EntityRepresentationStrategyMap( bootDescriptor, creationContext ); } else { @@ -65,56 +54,65 @@ public EmbeddableRepresentationStrategy resolveStrategy( Component bootDescriptor, Supplier runtimeDescriptorAccess, RuntimeModelCreationContext creationContext) { -// RepresentationMode representation = bootDescriptor.getExplicitRepresentationMode(); - final RepresentationMode representation; - if ( bootDescriptor.getComponentClassName() == null ) { - representation = RepresentationMode.MAP; + + final CompositeUserType compositeUserType = getCompositeUserType( bootDescriptor, creationContext ); + final EmbeddableInstantiator customInstantiator = + getCustomInstantiator( bootDescriptor, creationContext, compositeUserType ); + + if ( bootDescriptor.getComponentClassName() == null ) { // i.e. RepresentationMode.MAP; + return new EmbeddableRepresentationStrategyMap( + bootDescriptor, + runtimeDescriptorAccess, + customInstantiator, + creationContext + ); } else { - representation = RepresentationMode.POJO; + // todo (6.0) : fix this + // currently we end up resolving the ReflectionOptimizer from the BytecodeProvider + // multiple times per class + // + // instead, resolve ReflectionOptimizer once - here - and pass along to + // StandardPojoRepresentationStrategy + //noinspection unchecked + return new EmbeddableRepresentationStrategyPojo( + bootDescriptor, + runtimeDescriptorAccess, + customInstantiator, + (CompositeUserType) compositeUserType, + creationContext + ); } + } - final CompositeUserType compositeUserType; + private static CompositeUserType getCompositeUserType( + Component bootDescriptor, RuntimeModelCreationContext creationContext) { if ( bootDescriptor.getTypeName() != null ) { - final Class> userTypeClass = creationContext.getBootstrapContext() - .getClassLoaderAccess() - .classForName( bootDescriptor.getTypeName() ); - if ( !creationContext.getBootModel().getMetadataBuildingOptions().isAllowExtensionsInCdi() ) { - compositeUserType = FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( userTypeClass ); - } - else { - compositeUserType = - creationContext.getBootstrapContext().getManagedBeanRegistry() - .getBean( userTypeClass ) - .getBeanInstance(); - } + return beanInstance( creationContext, + creationContext.getBootstrapContext().getClassLoaderAccess() + .classForName( bootDescriptor.getTypeName() ) ); } else { - compositeUserType = null; + return null; } - final EmbeddableInstantiator customInstantiator; + } + + private static EmbeddableInstantiator getCustomInstantiator( + Component bootDescriptor, RuntimeModelCreationContext creationContext, CompositeUserType compositeUserType) { if ( bootDescriptor.getCustomInstantiator() != null ) { - final Class instantiatorClass = bootDescriptor.getCustomInstantiator(); - if ( !creationContext.getBootModel().getMetadataBuildingOptions().isAllowExtensionsInCdi() ) { - customInstantiator = FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( instantiatorClass ); - } - else { - customInstantiator = - creationContext.getBootstrapContext().getManagedBeanRegistry() - .getBean( instantiatorClass ) - .getBeanInstance(); - } + return beanInstance( creationContext, bootDescriptor.getCustomInstantiator() ); } else if ( compositeUserType != null ) { //noinspection unchecked,rawtypes - customInstantiator = new EmbeddableCompositeUserTypeInstantiator( (CompositeUserType) compositeUserType ); + return new EmbeddableCompositeUserTypeInstantiator( (CompositeUserType) compositeUserType ); } - else if ( bootDescriptor.getComponentClassName() != null && ReflectHelper.isRecord( bootDescriptor.getComponentClass() ) ) { + else if ( bootDescriptor.getComponentClassName() != null + && isRecord( bootDescriptor.getComponentClass() ) ) { if ( bootDescriptor.sortProperties() == null ) { - customInstantiator = new EmbeddableInstantiatorRecordStandard( bootDescriptor.getComponentClass() ); + return new EmbeddableInstantiatorRecordStandard( bootDescriptor.getComponentClass() ); } else { - customInstantiator = EmbeddableInstantiatorRecordIndirecting.of( + return EmbeddableInstantiatorRecordIndirecting.of( bootDescriptor.getComponentClass(), bootDescriptor.getPropertyNames() ); @@ -122,39 +120,26 @@ else if ( bootDescriptor.getComponentClassName() != null && ReflectHelper.isReco } else if ( bootDescriptor.getInstantiator() != null ) { bootDescriptor.sortProperties(); - customInstantiator = EmbeddableInstantiatorPojoIndirecting.of( + return EmbeddableInstantiatorPojoIndirecting.of( bootDescriptor.getPropertyNames(), bootDescriptor.getInstantiator(), bootDescriptor.getInstantiatorPropertyNames() ); } else { - customInstantiator = null; + return null; } + } - if ( representation == RepresentationMode.MAP ) { - return new EmbeddableRepresentationStrategyMap( - bootDescriptor, - runtimeDescriptorAccess, - customInstantiator, - creationContext - ); - } - else { - // todo (6.0) : fix this - // currently we end up resolving the ReflectionOptimizer from the BytecodeProvider - // multiple times per class - // - // instead, resolve ReflectionOptimizer once - here - and pass along to - // StandardPojoRepresentationStrategy - //noinspection unchecked - return new EmbeddableRepresentationStrategyPojo( - bootDescriptor, - runtimeDescriptorAccess, - customInstantiator, - (CompositeUserType) compositeUserType, - creationContext - ); - } + private static T beanInstance(RuntimeModelCreationContext creationContext, Class userTypeClass) { + return creationContext.getBootModel().getMetadataBuildingOptions().isAllowExtensionsInCdi() + ? getBeanInstance( creationContext, userTypeClass ) + : FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( userTypeClass ); + } + + private static T getBeanInstance(RuntimeModelCreationContext creationContext, Class userTypeClass) { + return creationContext.getBootstrapContext().getManagedBeanRegistry() + .getBean( userTypeClass ) + .getBeanInstance(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PluralAttributeMetadataImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PluralAttributeMetadataImpl.java index 0476ccc45ac3..16ae9184a499 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PluralAttributeMetadataImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PluralAttributeMetadataImpl.java @@ -39,9 +39,8 @@ class PluralAttributeMetadataImpl Member member, AttributeClassification attributeClassification, AttributeClassification elementClassification, - AttributeClassification listIndexOrMapKeyClassification, - MetadataContext metadataContext) { - super( propertyMapping, ownerType, member, attributeClassification, metadataContext ); + AttributeClassification listIndexOrMapKeyClassification) { + super( propertyMapping, ownerType, member, attributeClassification ); this.collectionClassification = determineCollectionType( getJavaType(), propertyMapping ); this.elementClassification = elementClassification; this.listIndexOrMapKeyClassification = listIndexOrMapKeyClassification; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PojoInstantiatorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PojoInstantiatorImpl.java deleted file mode 100644 index 620d30de86bf..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/PojoInstantiatorImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SPDX-License-Identifier: LGPL-2.1-or-later - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.metamodel.internal; - -import java.lang.reflect.Constructor; - -import org.hibernate.PropertyNotFoundException; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.type.descriptor.java.JavaType; - -/** - * @author Steve Ebersole - */ -public class PojoInstantiatorImpl extends AbstractPojoInstantiator { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PojoInstantiatorImpl.class ); - - private final Constructor constructor; - - public PojoInstantiatorImpl(JavaType javaType) { - super( javaType.getJavaTypeClass() ); - - this.constructor = isAbstract() - ? null - : resolveConstructor( getMappedPojoClass() ); - } - - protected static Constructor resolveConstructor(Class mappedPojoClass) { - try { - return ReflectHelper.getDefaultConstructor( mappedPojoClass); - } - catch ( PropertyNotFoundException e ) { - LOG.noDefaultConstructor( mappedPojoClass.getName() ); - } - - return null; - } - - protected Object applyInterception(Object entity) { - return entity; - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/SingularAttributeMetadataImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/SingularAttributeMetadataImpl.java index 7315b1338c92..90a22193bd77 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/SingularAttributeMetadataImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/SingularAttributeMetadataImpl.java @@ -23,9 +23,8 @@ public class SingularAttributeMetadataImpl extends BaseAttributeMetadata ownerType, Member member, - AttributeClassification attributeClassification, - MetadataContext metadataContext) { - super( propertyMapping, ownerType, member, attributeClassification, metadataContext ); + AttributeClassification attributeClassification) { + super( propertyMapping, ownerType, member, attributeClassification ); valueContext = new ValueContext() { @Override public Value getHibernateValue() { diff --git a/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java b/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java index 57209c4d018b..ef022cf3c11d 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java @@ -41,6 +41,7 @@ import org.hibernate.type.spi.CompositeTypeImplementor; import static org.hibernate.internal.util.ReflectHelper.isRecord; +import static org.hibernate.internal.util.StringHelper.unqualify; import static org.hibernate.metamodel.mapping.EntityDiscriminatorMapping.DISCRIMINATOR_ROLE_NAME; /** @@ -476,7 +477,7 @@ public String toLoggableString(Object value, SessionFactoryImplementor factory) result.put( propertyNames[i], propertyTypes[i].toLoggableString( values[i], factory ) ); } } - return StringHelper.unqualify( getName() ) + result; + return unqualify( getName() ) + result; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/type/TypeHelper.java b/hibernate-core/src/main/java/org/hibernate/type/TypeHelper.java index 0b9a2a82965f..d081cab3affe 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/TypeHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/type/TypeHelper.java @@ -47,8 +47,7 @@ public static void deepCopy( target[i] = values[i]; } else { - target[i] = types[i].deepCopy( values[i], session - .getFactory() ); + target[i] = types[i].deepCopy( values[i], session.getFactory() ); } } }