Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,10 @@
import org.hibernate.engine.FetchTiming;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.metamodel.mapping.AttributeMapping;
import org.hibernate.metamodel.mapping.CompositeIdentifierMapping;
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.SelectableMappings;
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
import org.hibernate.metamodel.model.domain.NavigableRole;
Expand All @@ -30,12 +25,10 @@
import org.hibernate.sql.ast.spi.SqlAliasBase;
import org.hibernate.sql.ast.spi.SqlAstCreationState;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.SqlTuple;
import org.hibernate.sql.ast.tree.from.StandardVirtualTableGroup;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.ast.tree.predicate.Predicate;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultCreationState;
Expand All @@ -48,6 +41,8 @@

import org.checkerframework.checker.nullness.qual.Nullable;

import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;

/**
* Base implementation for composite identifier mappings
*
Expand All @@ -66,7 +61,9 @@ public AbstractCompositeIdentifierMapping(
EntityMappingType entityMapping,
String tableExpression,
MappingModelCreationProcess creationProcess) {
this.navigableRole = entityMapping.getNavigableRole().appendContainer( EntityIdentifierMapping.ID_ROLE_NAME );
this.navigableRole =
entityMapping.getNavigableRole()
.appendContainer( ID_ROLE_NAME );
this.entityMapping = entityMapping;
this.tableExpression = tableExpression;
this.sessionFactory = creationProcess.getCreationContext().getSessionFactory();
Expand Down Expand Up @@ -135,8 +132,8 @@ public TableGroupJoin createTableGroupJoin(
boolean fetched,
boolean addsPredicate,
SqlAstCreationState creationState) {
final SqlAstJoinType joinType = determineSqlJoinType( lhs, requestedJoinType, fetched );
final TableGroup tableGroup = createRootTableGroupJoin(
final var joinType = determineSqlJoinType( lhs, requestedJoinType, fetched );
final var tableGroup = createRootTableGroupJoin(
navigablePath,
lhs,
explicitSourceAlias,
Expand All @@ -146,7 +143,6 @@ public TableGroupJoin createTableGroupJoin(
null,
creationState
);

return new TableGroupJoin( navigablePath, joinType, tableGroup, null );
}

Expand Down Expand Up @@ -184,26 +180,24 @@ public <X, Y> int forEachJdbcValue(
JdbcValuesBiConsumer<X, Y> valuesConsumer,
SharedSessionContractImplementor session) {
int span = 0;
final EmbeddableMappingType embeddableTypeDescriptor = getEmbeddableTypeDescriptor();
final var embeddableTypeDescriptor = getEmbeddableTypeDescriptor();
final int size = embeddableTypeDescriptor.getNumberOfAttributeMappings();
if ( value == null ) {
for ( int i = 0; i < size; i++ ) {
final AttributeMapping attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i );
final var attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i );
span += attributeMapping.forEachJdbcValue( null, span + offset, x, y, valuesConsumer, session );
}
}
else {
for ( int i = 0; i < size; i++ ) {
final AttributeMapping attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i );
final Object o = embeddableTypeDescriptor.getValue( value, i );
final var attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i );
final Object object = embeddableTypeDescriptor.getValue( value, i );
if ( attributeMapping instanceof ToOneAttributeMapping toOneAttributeMapping ) {
final ForeignKeyDescriptor fkDescriptor = toOneAttributeMapping.getForeignKeyDescriptor();
final Object identifier = fkDescriptor.getAssociationKeyFromSide(
o,
toOneAttributeMapping.getSideNature().inverse(),
session
);
span += fkDescriptor.forEachJdbcValue(
final var foreignKeyDescriptor = toOneAttributeMapping.getForeignKeyDescriptor();
final var inverse = toOneAttributeMapping.getSideNature().inverse();
final Object identifier =
foreignKeyDescriptor.getAssociationKeyFromSide( object, inverse, session );
span += foreignKeyDescriptor.forEachJdbcValue(
identifier,
span + offset,
x,
Expand All @@ -213,7 +207,7 @@ public <X, Y> int forEachJdbcValue(
);
}
else {
span += attributeMapping.forEachJdbcValue( o, span + offset, x, y, valuesConsumer, session );
span += attributeMapping.forEachJdbcValue( object, span + offset, x, y, valuesConsumer, session );
}
}
}
Expand All @@ -226,22 +220,22 @@ public SqlTuple toSqlExpression(
Clause clause,
SqmToSqlAstConverter walker,
SqlAstCreationState sqlAstCreationState) {
final SelectableMappings selectableMappings = getEmbeddableTypeDescriptor();
final List<ColumnReference> columnReferences = CollectionHelper.arrayList( selectableMappings.getJdbcTypeCount() );
final NavigablePath navigablePath = tableGroup.getNavigablePath().append( getNavigableRole().getNavigableName() );
final TableReference defaultTableReference = tableGroup.resolveTableReference( navigablePath, getContainingTableExpression() );
final List<ColumnReference> columnReferences = arrayList( getEmbeddableTypeDescriptor().getJdbcTypeCount() );
final var navigablePath = tableGroup.getNavigablePath().append( getNavigableRole().getNavigableName() );
final var defaultTableReference = tableGroup.resolveTableReference( navigablePath, getContainingTableExpression() );
getEmbeddableTypeDescriptor().forEachSelectable(
(columnIndex, selection) -> {
final TableReference tableReference = getContainingTableExpression().equals( selection.getContainingTableExpression() )
? defaultTableReference
: tableGroup.resolveTableReference( navigablePath, selection.getContainingTableExpression() );
final Expression columnReference = sqlAstCreationState.getSqlExpressionResolver()
.resolveSqlExpression( tableReference, selection );

final String containingTableExpression = selection.getContainingTableExpression();
final var tableReference =
getContainingTableExpression().equals( containingTableExpression )
? defaultTableReference
: tableGroup.resolveTableReference( navigablePath, containingTableExpression );
final var columnReference =
sqlAstCreationState.getSqlExpressionResolver()
.resolveSqlExpression( tableReference, selection );
columnReferences.add( (ColumnReference) columnReference );
}
);

return new SqlTuple( columnReferences, this );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ public String getRoleName() {
@Override
public boolean isInstance(Object object) {
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
// TODO: should this be an exception if there is no TYPE_KEY
&& roleName.equals( map.get( TYPE_KEY ) );
}

protected boolean isSameRole(String type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@


import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor.EntityRelatedState;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.spi.EntityInstantiator;
import org.hibernate.persister.entity.EntityPersister;
Expand All @@ -23,7 +24,7 @@ public abstract class AbstractEntityInstantiatorPojo extends AbstractPojoInstant

private final Class<?> proxyInterface;
private final boolean applyBytecodeInterception;
private final LazyAttributeLoadingInterceptor.EntityRelatedState loadingInterceptorState;
private final EntityRelatedState loadingInterceptorState;

public AbstractEntityInstantiatorPojo(
EntityPersister persister,
Expand All @@ -34,17 +35,15 @@ public AbstractEntityInstantiatorPojo(
//TODO this PojoEntityInstantiator appears to not be reused ?!
applyBytecodeInterception =
isPersistentAttributeInterceptableType( persistentClass.getMappedClass() );
if ( applyBytecodeInterception ) {
loadingInterceptorState = new LazyAttributeLoadingInterceptor.EntityRelatedState(
persister.getEntityName(),
persister.getBytecodeEnhancementMetadata()
.getLazyAttributesMetadata()
.getLazyAttributeNames()
);
}
else {
loadingInterceptorState = null;
}
loadingInterceptorState =
applyBytecodeInterception
? new EntityRelatedState(
persister.getEntityName(),
persister.getBytecodeEnhancementMetadata()
.getLazyAttributesMetadata()
.getLazyAttributeNames()
)
: null;
}

protected Object applyInterception(Object entity) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,26 +33,27 @@ protected BaseAttributeMetadata(
this.ownerType = ownerType;
this.member = member;
this.attributeClassification = attributeClassification;
//noinspection unchecked
javaType = (Class<Y>) declaredType( propertyMapping, member );
}

final Class declaredType;

private static Class<?> declaredType(Property propertyMapping, Member member) {
if ( member == null ) {
// assume we have a MAP entity-mode "class"
declaredType = propertyMapping.getType().getReturnedClass();
return propertyMapping.getType().getReturnedClass();
}
else if ( member instanceof Field field ) {
declaredType = field.getType();
return field.getType();
}
else if ( member instanceof Method method ) {
declaredType = method.getReturnType();
return method.getReturnType();
}
else if ( member instanceof MapMember mapMember ) {
declaredType = mapMember.getType();
return mapMember.getType();
}
else {
throw new IllegalArgumentException( "Cannot determine java-type from given member [" + member + "]" );
}
this.javaType = declaredType;
}

public String getName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ public EmbeddableInstantiatorDynamicMap(
@Override
public Object instantiate(ValueAccess valuesAccess) {
final Map<?,?> dataMap = generateDataMap();
final Object[] values = valuesAccess == null ? null : valuesAccess.getValues();
final var values = valuesAccess == null ? null : valuesAccess.getValues();
if ( values != null ) {
final EmbeddableMappingType mappingType = runtimeDescriptorAccess.get();
final var mappingType = runtimeDescriptorAccess.get();
mappingType.setValues( dataMap, values );
}
return dataMap;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public static EmbeddableInstantiatorPojoIndirecting of(
@Override
public Object instantiate(ValueAccess valuesAccess) {
try {
final Object[] originalValues = valuesAccess.getValues();
final Object[] values = new Object[originalValues.length];
final var originalValues = valuesAccess.getValues();
final var values = new Object[originalValues.length];
for ( int i = 0; i < values.length; i++ ) {
values[i] = originalValues[index[i]];
}
Expand All @@ -61,8 +61,8 @@ public EmbeddableInstantiatorPojoIndirectingWithGap(Constructor<?> constructor,
@Override
public Object instantiate(ValueAccess valuesAccess) {
try {
final Object[] originalValues = valuesAccess.getValues();
final Object[] values = new Object[index.length];
final var originalValues = valuesAccess.getValues();
final var values = new Object[index.length];
for ( int i = 0; i < values.length; i++ ) {
final int index = this.index[i];
if ( index >= 0 ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public EmbeddableInstantiatorPojoOptimized(
@Override
public Object instantiate(ValueAccess valuesAccess) {
final Object embeddable = instantiationOptimizer.newInstance();
final EmbeddableMappingType embeddableMapping = embeddableMappingAccess.get();
final Object[] values = valuesAccess.getValues();
final var embeddableMapping = embeddableMappingAccess.get();
final var values = valuesAccess.getValues();
if ( values != null ) {
embeddableMapping.setValues( embeddable, values );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public Object instantiate(ValueAccess valuesAccess) {
}

try {
final Object[] values = valuesAccess == null ? null : valuesAccess.getValues();
final var values = valuesAccess == null ? null : valuesAccess.getValues();
final Object instance = constructor.newInstance();
if ( values != null ) {
// At this point, createEmptyCompositesEnabled is always true.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public EmbeddableInstantiatorProxied(
@Override
public Object instantiate(ValueAccess valuesAccess) {
final Object proxy = factory.getProxy();
final Object[] values = valuesAccess == null ? null : valuesAccess.getValues();
final var values = valuesAccess == null ? null : valuesAccess.getValues();
if ( values != null ) {
embeddableMappingAccess.get().setValues( proxy, values );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ public Object instantiate(ValueAccess valuesAccess) {
}

try {
final Object[] originalValues = valuesAccess.getValues();
final Object[] values = new Object[originalValues.length];
final var originalValues = valuesAccess.getValues();
final var values = new Object[originalValues.length];
for ( int i = 0; i < values.length; i++ ) {
values[i] = originalValues[index[i]];
}
Expand All @@ -62,8 +62,8 @@ public Object instantiate(ValueAccess valuesAccess) {
}

try {
final Object[] originalValues = valuesAccess.getValues();
final Object[] values = new Object[index.length];
final var originalValues = valuesAccess.getValues();
final var values = new Object[index.length];
for ( int i = 0; i < values.length; i++ ) {
final int index = this.index[i];
if ( index >= 0 ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ public class EmbeddableInstantiatorRecordStandard extends AbstractPojoInstantiat

public EmbeddableInstantiatorRecordStandard(Class<?> javaType) {
super( javaType );
final Class<?>[] componentTypes = getRecordComponentTypes( javaType );
this.constructor = getConstructorOrNull( javaType, componentTypes );
constructor = getConstructorOrNull( javaType, getRecordComponentTypes( javaType ) );
}

@Override
Expand Down
Loading