Skip to content

Commit

Permalink
Some pre-work for embeddable instantiator work.
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed Nov 12, 2021
1 parent db12d5a commit 7b1201d
Show file tree
Hide file tree
Showing 17 changed files with 193 additions and 299 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.Iterator;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.Type;

import org.hibernate.AssertionFailure;
import org.hibernate.internal.EntityManagerMessageLogger;
Expand All @@ -29,6 +25,7 @@
import org.hibernate.mapping.Value;
import org.hibernate.metamodel.AttributeClassification;
import org.hibernate.metamodel.RepresentationMode;
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
import org.hibernate.metamodel.model.domain.AbstractIdentifiableType;
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
Expand All @@ -52,6 +49,12 @@
import org.hibernate.type.EntityType;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
import org.hibernate.type.spi.CompositeTypeImplementor;

import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.Type;

/**
* A factory for building {@link Attribute} instances. Exposes 3 main services for building<ol>
Expand Down Expand Up @@ -231,21 +234,16 @@ public static <Y> SimpleDomainType<Y> determineSimpleType(ValueContext typeConte
final Component component = (Component) typeContext.getHibernateValue();
final EmbeddableTypeImpl<Y> embeddableType;

final EmbeddableRepresentationStrategy representationStrategy = context.getTypeConfiguration()
.getMetadataBuildingContext()
.getBuildingOptions()
.getManagedTypeRepresentationResolver()
.resolveStrategy( component, context.getRuntimeModelCreationContext() );

if ( component.isDynamic() ) {
final JavaType javaTypeDescriptor = context.getJavaTypeDescriptorRegistry().getDescriptor( Map.class );

embeddableType = new EmbeddableTypeImpl<>(
javaTypeDescriptor,
representationStrategy,
true,
context.getJpaMetamodel()
);

context.registerComponentByEmbeddable( embeddableType, component );
}
else {
// we should have a non-dynamic embeddable
Expand All @@ -263,7 +261,6 @@ public static <Y> SimpleDomainType<Y> determineSimpleType(ValueContext typeConte

embeddableType = new EmbeddableTypeImpl<>(
javaTypeDescriptor,
representationStrategy,
false,
context.getJpaMetamodel()
);
Expand Down Expand Up @@ -585,16 +582,23 @@ else if ( member instanceof Method ) {

private static final MemberResolver embeddedMemberResolver = (attributeContext, metadataContext) -> {
// the owner is an embeddable
final EmbeddableDomainType<?> ownerType = (EmbeddableDomainType) attributeContext.getOwnerType();
final EmbeddableDomainType<?> ownerType = (EmbeddableDomainType<?>) attributeContext.getOwnerType();
final Component ownerBootDescriptor = metadataContext.getEmbeddableBootDescriptor( ownerType );

final CompositeTypeImplementor ownerComponentType = (CompositeTypeImplementor) ownerBootDescriptor.getType();
final EmbeddableValuedModelPart ownerMappingModelDescriptor = ownerComponentType.getMappingModelPart();
final EmbeddableRepresentationStrategy ownerRepStrategy = ownerMappingModelDescriptor
.getEmbeddableTypeDescriptor()
.getRepresentationStrategy();

if ( ownerType.getRepresentationStrategy().getMode() == RepresentationMode.MAP ) {
if ( ownerRepStrategy.getMode() == RepresentationMode.MAP ) {
return new MapMember(
attributeContext.getPropertyMapping().getName(),
attributeContext.getPropertyMapping().getType().getReturnedClass()
);
}
else {
return ownerType.getRepresentationStrategy()
return ownerRepStrategy
.resolvePropertyAccess( attributeContext.getPropertyMapping() )
.getGetter()
.getMember();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
*/
package org.hibernate.metamodel.internal;

import java.util.Map;
import java.util.function.Supplier;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.mapping.Component;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.spi.EmbeddableInstantiator;

/**
Expand All @@ -20,12 +22,24 @@
public class EmbeddableInstantiatorDynamicMap
extends AbstractDynamicMapInstantiator
implements EmbeddableInstantiator {
public EmbeddableInstantiatorDynamicMap(Component bootDescriptor) {
private final Supplier<EmbeddableMappingType> runtimeDescriptorAccess;

public EmbeddableInstantiatorDynamicMap(
Component bootDescriptor,
Supplier<EmbeddableMappingType> runtimeDescriptorAccess) {
super( bootDescriptor.getRoleName() );
this.runtimeDescriptorAccess = runtimeDescriptorAccess;
}

@Override
public Object instantiate(Supplier<Object[]> valuesAccess, SessionFactoryImplementor sessionFactory) {
return generateDataMap();
final Map<?,?> dataMap = generateDataMap();

if ( valuesAccess != null ) {
final EmbeddableMappingType mappingType = runtimeDescriptorAccess.get();
mappingType.setPropertyValues( dataMap, valuesAccess.get() );
}

return dataMap;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@
import java.util.function.Supplier;

import org.hibernate.InstantiationException;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.PropertyNotFoundException;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.mapping.Component;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.spi.EmbeddableInstantiator;
import org.hibernate.type.descriptor.java.JavaType;

Expand All @@ -27,16 +28,16 @@
public class EmbeddableInstantiatorPojoStandard extends AbstractPojoInstantiator implements EmbeddableInstantiator {
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( PojoInstantiatorImpl.class );

private final Supplier<EmbeddableMappingType> embeddableMappingAccess;
private final Constructor<?> constructor;

public EmbeddableInstantiatorPojoStandard(
@SuppressWarnings("unused") Component bootDescriptor,
Supplier<EmbeddableMappingType> embeddableMappingAccess,
JavaType<?> javaTypeDescriptor) {
super( javaTypeDescriptor.getJavaTypeClass() );

constructor = resolveConstructor( javaTypeDescriptor.getJavaTypeClass() );

// todo (6.0) : add support for constructor value injection
this.embeddableMappingAccess = embeddableMappingAccess;
this.constructor = resolveConstructor( javaTypeDescriptor.getJavaTypeClass() );
}

protected static Constructor<?> resolveConstructor(Class<?> mappedPojoClass) {
Expand All @@ -55,16 +56,27 @@ public Object instantiate(Supplier<Object[]> valuesAccess, SessionFactoryImpleme
if ( isAbstract() ) {
throw new InstantiationException( "Cannot instantiate abstract class or interface: ", getMappedPojoClass() );
}
else if ( constructor == null ) {

if ( constructor == null ) {
throw new InstantiationException( "No default constructor for embeddable: ", getMappedPojoClass() );
}
else {
try {
return constructor.newInstance( (Object[]) null );

if ( valuesAccess != null ) {
if ( constructor.getParameterTypes().length > 0 ) {
// constructor injection
throw new NotYetImplementedFor6Exception( "Constructor injection for embeddables not yet implemented" );
}
catch ( Exception e ) {
throw new InstantiationException( "Could not instantiate entity: ", getMappedPojoClass(), e );
}

try {
final Object instance = constructor.newInstance();
if ( valuesAccess != null ) {
embeddableMappingAccess.get().setPropertyValues( instance, valuesAccess.get() );
}
return instance;
}
catch ( Exception e ) {
throw new InstantiationException( "Could not instantiate embeddable: ", getMappedPojoClass(), e );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
package org.hibernate.metamodel.internal;

import java.util.Map;
import java.util.function.Supplier;

import org.hibernate.bytecode.spi.ReflectionOptimizer;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.Property;
import org.hibernate.metamodel.RepresentationMode;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.spi.EmbeddableInstantiator;
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
Expand All @@ -28,9 +30,10 @@ public class EmbeddableRepresentationStrategyMap implements EmbeddableRepresenta

public EmbeddableRepresentationStrategyMap(
Component bootDescriptor,
Supplier<EmbeddableMappingType> runtimeDescriptorAccess,
RuntimeModelCreationContext creationContext) {
this.mapJtd = creationContext.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Map.class );
this.instantiator = new EmbeddableInstantiatorDynamicMap( bootDescriptor );
this.instantiator = new EmbeddableInstantiatorDynamicMap( bootDescriptor, runtimeDescriptorAccess );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.hibernate.metamodel.internal;

import java.util.Locale;
import java.util.function.Supplier;

import org.hibernate.HibernateException;
import org.hibernate.boot.registry.selector.spi.StrategySelector;
Expand All @@ -20,6 +21,7 @@
import org.hibernate.mapping.IndexBackref;
import org.hibernate.mapping.Property;
import org.hibernate.metamodel.RepresentationMode;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.spi.EmbeddableInstantiator;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
Expand All @@ -39,6 +41,7 @@ public class EmbeddableRepresentationStrategyPojo extends AbstractEmbeddableRepr

public EmbeddableRepresentationStrategyPojo(
Component bootDescriptor,
Supplier<EmbeddableMappingType> runtimeDescriptorAccess,
RuntimeModelCreationContext creationContext) {
super(
bootDescriptor,
Expand All @@ -64,10 +67,10 @@ public EmbeddableRepresentationStrategyPojo(
false
);

this.instantiator = determineInstantiator( bootDescriptor );
this.instantiator = determineInstantiator( runtimeDescriptorAccess );
}

private EmbeddableInstantiator determineInstantiator(Component bootDescriptor) {
private EmbeddableInstantiator determineInstantiator(Supplier<EmbeddableMappingType> runtimeDescriptorAccess) {
if ( reflectionOptimizer != null && reflectionOptimizer.getInstantiationOptimizer() != null ) {
final ReflectionOptimizer.InstantiationOptimizer instantiationOptimizer = reflectionOptimizer.getInstantiationOptimizer();
return new EmbeddableInstantiatorPojoOptimized(
Expand All @@ -77,7 +80,7 @@ private EmbeddableInstantiator determineInstantiator(Component bootDescriptor) {
}

return new EmbeddableInstantiatorPojoStandard(
bootDescriptor,
runtimeDescriptorAccess,
getEmbeddableJavaTypeDescriptor()
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import org.hibernate.type.CompositeType;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
import org.hibernate.type.spi.CompositeTypeImplementor;

/**
* @author Steve Ebersole
Expand Down Expand Up @@ -112,12 +113,14 @@ public EntityRepresentationStrategyPojoStandard(
if ( bootDescriptor.getIdentifierMapper() != null ) {
mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo(
bootDescriptor.getIdentifierMapper(),
() -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() ).getMappingModelPart().getEmbeddableTypeDescriptor(),
creationContext
);
}
else if ( bootDescriptorIdentifier != null ) {
mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo(
(Component) bootDescriptorIdentifier,
() -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() ).getMappingModelPart().getEmbeddableTypeDescriptor(),
creationContext
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@
package org.hibernate.metamodel.internal;


import java.util.function.Supplier;

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.EmbeddableRepresentationStrategy;
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver;
Expand Down Expand Up @@ -58,6 +61,7 @@ public EntityRepresentationStrategy resolveStrategy(
@Override
public EmbeddableRepresentationStrategy resolveStrategy(
Component bootDescriptor,
Supplier<EmbeddableMappingType> runtimeDescriptorAccess,
RuntimeModelCreationContext creationContext) {
// RepresentationMode representation = bootDescriptor.getExplicitRepresentationMode();
RepresentationMode representation = null;
Expand All @@ -71,7 +75,7 @@ public EmbeddableRepresentationStrategy resolveStrategy(
}

if ( representation == RepresentationMode.MAP ) {
return new EmbeddableRepresentationStrategyMap( bootDescriptor, creationContext );
return new EmbeddableRepresentationStrategyMap( bootDescriptor, runtimeDescriptorAccess, creationContext );
}
else {
// todo (6.0) : fix this
Expand All @@ -80,7 +84,7 @@ public EmbeddableRepresentationStrategy resolveStrategy(
//
// instead, resolve ReflectionOptimizer once - here - and pass along to
// StandardPojoRepresentationStrategy
return new EmbeddableRepresentationStrategyPojo( bootDescriptor, creationContext );
return new EmbeddableRepresentationStrategyPojo( bootDescriptor, runtimeDescriptorAccess, creationContext );
}
}
}
Loading

0 comments on commit 7b1201d

Please sign in to comment.