HHH-16353 Make it possible for Hibernate Reactive to override the creation of AttributeMapping and Fetch strategies
This commit is contained in:
parent
837d1a32cb
commit
d63ff31b59
|
@ -27,6 +27,11 @@ public abstract class AbstractAttributeMapping implements AttributeMapping {
|
||||||
this.declaringType = declaringType;
|
this.declaringType = declaringType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected AbstractAttributeMapping(AbstractAttributeMapping original) {
|
||||||
|
this( original.name, original.fetchableIndex, original.declaringType );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ManagedMappingType getDeclaringType() {
|
public ManagedMappingType getDeclaringType() {
|
||||||
return declaringType;
|
return declaringType;
|
||||||
|
|
|
@ -23,6 +23,7 @@ import org.hibernate.metamodel.mapping.AssociationKey;
|
||||||
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
|
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||||
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
|
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
|
||||||
|
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.persister.collection.CollectionPersister;
|
import org.hibernate.persister.collection.CollectionPersister;
|
||||||
import org.hibernate.persister.entity.PropertyMapping;
|
import org.hibernate.persister.entity.PropertyMapping;
|
||||||
|
@ -41,6 +42,7 @@ import org.hibernate.sql.results.graph.DomainResult;
|
||||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||||
import org.hibernate.sql.results.graph.FetchOptions;
|
import org.hibernate.sql.results.graph.FetchOptions;
|
||||||
import org.hibernate.sql.results.graph.FetchParent;
|
import org.hibernate.sql.results.graph.FetchParent;
|
||||||
|
import org.hibernate.sql.results.graph.collection.internal.EagerCollectionFetch;
|
||||||
import org.hibernate.sql.results.graph.entity.EntityFetch;
|
import org.hibernate.sql.results.graph.entity.EntityFetch;
|
||||||
import org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl;
|
import org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl;
|
||||||
import org.hibernate.type.CompositeType;
|
import org.hibernate.type.CompositeType;
|
||||||
|
@ -82,6 +84,16 @@ public abstract class AbstractEntityCollectionPart implements EntityCollectionPa
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected AbstractEntityCollectionPart(AbstractEntityCollectionPart original) {
|
||||||
|
this.navigableRole = original.navigableRole;
|
||||||
|
this.nature = original.nature;
|
||||||
|
this.collectionDescriptor = original.collectionDescriptor;
|
||||||
|
this.associatedEntityTypeDescriptor = original.associatedEntityTypeDescriptor;
|
||||||
|
this.notFoundAction = original.notFoundAction;
|
||||||
|
this.targetKeyPropertyNames = original.targetKeyPropertyNames;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "EntityCollectionPart(" + navigableRole.getFullPath() + ")@" + System.identityHashCode( this );
|
return "EntityCollectionPart(" + navigableRole.getFullPath() + ")@" + System.identityHashCode( this );
|
||||||
|
@ -193,7 +205,7 @@ public abstract class AbstractEntityCollectionPart implements EntityCollectionPa
|
||||||
final boolean added = creationState.registerVisitedAssociationKey( associationKey );
|
final boolean added = creationState.registerVisitedAssociationKey( associationKey );
|
||||||
|
|
||||||
final TableGroup partTableGroup = resolveTableGroup( fetchablePath, creationState );
|
final TableGroup partTableGroup = resolveTableGroup( fetchablePath, creationState );
|
||||||
final EntityFetchJoinedImpl fetch = new EntityFetchJoinedImpl(
|
final EntityFetch fetch = buildEntityFetchJoined(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
partTableGroup,
|
partTableGroup,
|
||||||
|
@ -208,6 +220,38 @@ public abstract class AbstractEntityCollectionPart implements EntityCollectionPa
|
||||||
return fetch;
|
return fetch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EagerCollectionFetch buildEagerCollectionFetch(
|
||||||
|
NavigablePath fetchedPath,
|
||||||
|
PluralAttributeMapping fetchedAttribute,
|
||||||
|
TableGroup collectionTableGroup,
|
||||||
|
FetchParent fetchParent,
|
||||||
|
DomainResultCreationState creationState) {
|
||||||
|
return new EagerCollectionFetch(
|
||||||
|
fetchedPath,
|
||||||
|
fetchedAttribute,
|
||||||
|
collectionTableGroup,
|
||||||
|
fetchParent,
|
||||||
|
creationState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EntityFetch buildEntityFetchJoined(
|
||||||
|
FetchParent fetchParent,
|
||||||
|
AbstractEntityCollectionPart abstractEntityCollectionPart,
|
||||||
|
TableGroup partTableGroup,
|
||||||
|
NavigablePath fetchablePath,
|
||||||
|
DomainResultCreationState creationState) {
|
||||||
|
return new EntityFetchJoinedImpl(
|
||||||
|
fetchParent,
|
||||||
|
abstractEntityCollectionPart,
|
||||||
|
partTableGroup,
|
||||||
|
fetchablePath,
|
||||||
|
creationState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract AssociationKey resolveFetchAssociationKey();
|
protected abstract AssociationKey resolveFetchAssociationKey();
|
||||||
|
|
||||||
private TableGroup resolveTableGroup(NavigablePath fetchablePath, DomainResultCreationState creationState) {
|
private TableGroup resolveTableGroup(NavigablePath fetchablePath, DomainResultCreationState creationState) {
|
||||||
|
|
|
@ -49,6 +49,12 @@ public abstract class AbstractSingularAttributeMapping
|
||||||
this.propertyAccess = propertyAccess;
|
this.propertyAccess = propertyAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected AbstractSingularAttributeMapping( AbstractSingularAttributeMapping original ) {
|
||||||
|
super( original );
|
||||||
|
this.propertyAccess = original.propertyAccess;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PropertyAccess getPropertyAccess() {
|
public PropertyAccess getPropertyAccess() {
|
||||||
return propertyAccess;
|
return propertyAccess;
|
||||||
|
|
|
@ -57,6 +57,16 @@ public abstract class AbstractStateArrayContributorMapping
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected AbstractStateArrayContributorMapping(AbstractStateArrayContributorMapping original) {
|
||||||
|
super( original );
|
||||||
|
this.attributeMetadata = original.attributeMetadata;
|
||||||
|
this.fetchTiming = original.fetchTiming;
|
||||||
|
this.fetchStyle = original.fetchStyle;
|
||||||
|
this.stateArrayPosition = original.stateArrayPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getStateArrayPosition() {
|
public int getStateArrayPosition() {
|
||||||
return stateArrayPosition;
|
return stateArrayPosition;
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.SortedMap;
|
import java.util.SortedMap;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.hibernate.FetchMode;
|
import org.hibernate.FetchMode;
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
|
@ -431,6 +432,33 @@ public class MappingModelCreationHelper {
|
||||||
CascadeStyle cascadeStyle,
|
CascadeStyle cascadeStyle,
|
||||||
FetchMode fetchMode,
|
FetchMode fetchMode,
|
||||||
MappingModelCreationProcess creationProcess) {
|
MappingModelCreationProcess creationProcess) {
|
||||||
|
return buildPluralAttributeMapping(
|
||||||
|
attrName,
|
||||||
|
stateArrayPosition,
|
||||||
|
fetchableIndex,
|
||||||
|
bootProperty,
|
||||||
|
declaringType,
|
||||||
|
propertyAccess,
|
||||||
|
cascadeStyle,
|
||||||
|
fetchMode,
|
||||||
|
creationProcess,
|
||||||
|
Function.identity()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
public static PluralAttributeMapping buildPluralAttributeMapping(
|
||||||
|
String attrName,
|
||||||
|
int stateArrayPosition,
|
||||||
|
int fetchableIndex,
|
||||||
|
Property bootProperty,
|
||||||
|
ManagedMappingType declaringType,
|
||||||
|
PropertyAccess propertyAccess,
|
||||||
|
CascadeStyle cascadeStyle,
|
||||||
|
FetchMode fetchMode,
|
||||||
|
MappingModelCreationProcess creationProcess,
|
||||||
|
// For Hibernate Reactive
|
||||||
|
Function<PluralAttributeMappingImpl, PluralAttributeMappingImpl> mappingConverter) {
|
||||||
|
|
||||||
final Collection bootValueMapping = (Collection) bootProperty.getValue();
|
final Collection bootValueMapping = (Collection) bootProperty.getValue();
|
||||||
|
|
||||||
|
@ -625,28 +653,33 @@ public class MappingModelCreationHelper {
|
||||||
sessionFactory
|
sessionFactory
|
||||||
);
|
);
|
||||||
|
|
||||||
final PluralAttributeMappingImpl pluralAttributeMapping = new PluralAttributeMappingImpl(
|
final PluralAttributeMappingImpl pluralAttributeMapping = mappingConverter
|
||||||
attrName,
|
.apply( new PluralAttributeMappingImpl(
|
||||||
bootValueMapping,
|
attrName,
|
||||||
propertyAccess,
|
bootValueMapping,
|
||||||
attributeMetadata,
|
propertyAccess,
|
||||||
collectionMappingType,
|
attributeMetadata,
|
||||||
stateArrayPosition,
|
collectionMappingType,
|
||||||
fetchableIndex,
|
stateArrayPosition,
|
||||||
elementDescriptor,
|
fetchableIndex,
|
||||||
indexDescriptor,
|
elementDescriptor,
|
||||||
identifierDescriptor,
|
indexDescriptor,
|
||||||
timing,
|
identifierDescriptor,
|
||||||
style,
|
timing,
|
||||||
cascadeStyle,
|
style,
|
||||||
declaringType,
|
cascadeStyle,
|
||||||
collectionDescriptor
|
declaringType,
|
||||||
);
|
collectionDescriptor
|
||||||
|
) );
|
||||||
|
|
||||||
creationProcess.registerInitializationCallback(
|
creationProcess.registerInitializationCallback(
|
||||||
"PluralAttributeMapping(" + bootValueMapping.getRole() + ")#finishInitialization",
|
"PluralAttributeMapping(" + bootValueMapping.getRole() + ")#finishInitialization",
|
||||||
() -> {
|
() -> {
|
||||||
pluralAttributeMapping.finishInitialization( bootProperty, bootValueMapping, creationProcess );
|
pluralAttributeMapping.finishInitialization(
|
||||||
|
bootProperty,
|
||||||
|
bootValueMapping,
|
||||||
|
creationProcess
|
||||||
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -1550,6 +1583,7 @@ public class MappingModelCreationHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
public static ToOneAttributeMapping buildSingularAssociationAttributeMapping(
|
public static ToOneAttributeMapping buildSingularAssociationAttributeMapping(
|
||||||
String attrName,
|
String attrName,
|
||||||
NavigableRole navigableRole,
|
NavigableRole navigableRole,
|
||||||
|
@ -1562,6 +1596,35 @@ public class MappingModelCreationHelper {
|
||||||
PropertyAccess propertyAccess,
|
PropertyAccess propertyAccess,
|
||||||
CascadeStyle cascadeStyle,
|
CascadeStyle cascadeStyle,
|
||||||
MappingModelCreationProcess creationProcess) {
|
MappingModelCreationProcess creationProcess) {
|
||||||
|
return buildSingularAssociationAttributeMapping(
|
||||||
|
attrName,
|
||||||
|
navigableRole,
|
||||||
|
stateArrayPosition,
|
||||||
|
fetchableIndex,
|
||||||
|
bootProperty,
|
||||||
|
declaringType,
|
||||||
|
declaringEntityPersister,
|
||||||
|
attrType,
|
||||||
|
propertyAccess,
|
||||||
|
cascadeStyle,
|
||||||
|
creationProcess,
|
||||||
|
Function.identity()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ToOneAttributeMapping buildSingularAssociationAttributeMapping(
|
||||||
|
String attrName,
|
||||||
|
NavigableRole navigableRole,
|
||||||
|
int stateArrayPosition,
|
||||||
|
int fetchableIndex,
|
||||||
|
Property bootProperty,
|
||||||
|
ManagedMappingType declaringType,
|
||||||
|
EntityPersister declaringEntityPersister,
|
||||||
|
EntityType attrType,
|
||||||
|
PropertyAccess propertyAccess,
|
||||||
|
CascadeStyle cascadeStyle,
|
||||||
|
MappingModelCreationProcess creationProcess,
|
||||||
|
Function<ToOneAttributeMapping, ToOneAttributeMapping> mappingConverter) {
|
||||||
if ( bootProperty.getValue() instanceof ToOne ) {
|
if ( bootProperty.getValue() instanceof ToOne ) {
|
||||||
final ToOne value = (ToOne) bootProperty.getValue();
|
final ToOne value = (ToOne) bootProperty.getValue();
|
||||||
final EntityPersister entityPersister = creationProcess.getEntityPersister( value.getReferencedEntityName() );
|
final EntityPersister entityPersister = creationProcess.getEntityPersister( value.getReferencedEntityName() );
|
||||||
|
@ -1614,7 +1677,7 @@ public class MappingModelCreationHelper {
|
||||||
fetchTiming = FetchOptionsHelper.determineFetchTiming( fetchStyle, type, lazy, role, sessionFactory );
|
fetchTiming = FetchOptionsHelper.determineFetchTiming( fetchStyle, type, lazy, role, sessionFactory );
|
||||||
}
|
}
|
||||||
|
|
||||||
final ToOneAttributeMapping attributeMapping = new ToOneAttributeMapping(
|
final ToOneAttributeMapping attributeMapping = mappingConverter.apply( new ToOneAttributeMapping(
|
||||||
attrName,
|
attrName,
|
||||||
navigableRole,
|
navigableRole,
|
||||||
stateArrayPosition,
|
stateArrayPosition,
|
||||||
|
@ -1627,7 +1690,7 @@ public class MappingModelCreationHelper {
|
||||||
declaringType,
|
declaringType,
|
||||||
declaringEntityPersister,
|
declaringEntityPersister,
|
||||||
propertyAccess
|
propertyAccess
|
||||||
);
|
) );
|
||||||
|
|
||||||
creationProcess.registerForeignKeyPostInitCallbacks(
|
creationProcess.registerForeignKeyPostInitCallbacks(
|
||||||
"To-one key - " + navigableRole,
|
"To-one key - " + navigableRole,
|
||||||
|
|
|
@ -73,6 +73,12 @@ public class OneToManyCollectionPart extends AbstractEntityCollectionPart implem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected OneToManyCollectionPart(OneToManyCollectionPart original) {
|
||||||
|
super( original );
|
||||||
|
this.mapKeyPropertyName = original.mapKeyPropertyName;
|
||||||
|
this.fetchAssociationKey = original.fetchAssociationKey;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Cardinality getCardinality() {
|
public Cardinality getCardinality() {
|
||||||
return Cardinality.ONE_TO_MANY;
|
return Cardinality.ONE_TO_MANY;
|
||||||
|
|
|
@ -190,16 +190,49 @@ public class PluralAttributeMappingImpl
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
injectAttributeMapping( elementDescriptor, indexDescriptor, collectionDescriptor, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected PluralAttributeMappingImpl(PluralAttributeMappingImpl original) {
|
||||||
|
super( original );
|
||||||
|
this.propertyAccess = original.propertyAccess;
|
||||||
|
this.attributeMetadata = original.attributeMetadata;
|
||||||
|
this.collectionMappingType = original.collectionMappingType;
|
||||||
|
this.stateArrayPosition = original.stateArrayPosition;
|
||||||
|
this.elementDescriptor = original.elementDescriptor;
|
||||||
|
this.indexDescriptor = original.indexDescriptor;
|
||||||
|
this.identifierDescriptor = original.identifierDescriptor;
|
||||||
|
this.fetchTiming = original.fetchTiming;
|
||||||
|
this.fetchStyle = original.fetchStyle;
|
||||||
|
this.collectionDescriptor = original.collectionDescriptor;
|
||||||
|
this.referencedPropertyName = original.referencedPropertyName;
|
||||||
|
this.mapKeyPropertyName = original.mapKeyPropertyName;
|
||||||
|
this.bidirectionalAttributeName = original.bidirectionalAttributeName;
|
||||||
|
this.sqlAliasStem = original.sqlAliasStem;
|
||||||
|
this.separateCollectionTable = original.separateCollectionTable;
|
||||||
|
this.indexMetadata = original.indexMetadata;
|
||||||
|
this.fkDescriptor = original.fkDescriptor;
|
||||||
|
this.orderByFragment = original.orderByFragment;
|
||||||
|
this.manyToManyOrderByFragment = original.manyToManyOrderByFragment;
|
||||||
|
injectAttributeMapping( elementDescriptor, indexDescriptor, collectionDescriptor, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void injectAttributeMapping(
|
||||||
|
CollectionPart elementDescriptor,
|
||||||
|
CollectionPart indexDescriptor,
|
||||||
|
CollectionPersister collectionDescriptor,
|
||||||
|
PluralAttributeMapping mapping) {
|
||||||
if ( collectionDescriptor instanceof Aware ) {
|
if ( collectionDescriptor instanceof Aware ) {
|
||||||
( (Aware) collectionDescriptor ).injectAttributeMapping( this );
|
( (Aware) collectionDescriptor ).injectAttributeMapping( mapping );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( elementDescriptor instanceof Aware ) {
|
if ( elementDescriptor instanceof Aware ) {
|
||||||
( (Aware) elementDescriptor ).injectAttributeMapping( this );
|
( (Aware) elementDescriptor ).injectAttributeMapping( mapping );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( indexDescriptor instanceof Aware ) {
|
if ( indexDescriptor instanceof Aware ) {
|
||||||
( (Aware) indexDescriptor ).injectAttributeMapping( this );
|
( (Aware) indexDescriptor ).injectAttributeMapping( mapping );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,7 +438,7 @@ public class PluralAttributeMappingImpl
|
||||||
sqlAstCreationState
|
sqlAstCreationState
|
||||||
);
|
);
|
||||||
|
|
||||||
return new EagerCollectionFetch(
|
return buildEagerCollectionFetch(
|
||||||
fetchablePath,
|
fetchablePath,
|
||||||
this,
|
this,
|
||||||
collectionTableGroup,
|
collectionTableGroup,
|
||||||
|
@ -443,6 +476,40 @@ public class PluralAttributeMappingImpl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected Fetch buildDelayedCollectionFetch(
|
||||||
|
NavigablePath fetchedPath,
|
||||||
|
PluralAttributeMapping fetchedAttribute,
|
||||||
|
FetchParent fetchParent,
|
||||||
|
DomainResult<?> collectionKeyResult) {
|
||||||
|
return new DelayedCollectionFetch( fetchedPath, fetchedAttribute, fetchParent, collectionKeyResult );
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected Fetch buildSelectEagerCollectionFetch(
|
||||||
|
NavigablePath fetchedPath,
|
||||||
|
PluralAttributeMapping fetchedAttribute,
|
||||||
|
DomainResult<?> collectionKeyDomainResult,
|
||||||
|
FetchParent fetchParent) {
|
||||||
|
return new SelectEagerCollectionFetch( fetchedPath, fetchedAttribute, collectionKeyDomainResult, fetchParent );
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected Fetch buildEagerCollectionFetch(
|
||||||
|
NavigablePath fetchedPath,
|
||||||
|
PluralAttributeMapping fetchedAttribute,
|
||||||
|
TableGroup collectionTableGroup,
|
||||||
|
FetchParent fetchParent,
|
||||||
|
DomainResultCreationState creationState) {
|
||||||
|
return new EagerCollectionFetch(
|
||||||
|
fetchedPath,
|
||||||
|
fetchedAttribute,
|
||||||
|
collectionTableGroup,
|
||||||
|
fetchParent,
|
||||||
|
creationState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Fetch resolveCircularFetch(
|
public Fetch resolveCircularFetch(
|
||||||
NavigablePath fetchablePath,
|
NavigablePath fetchablePath,
|
||||||
|
@ -481,7 +548,7 @@ public class PluralAttributeMappingImpl
|
||||||
else {
|
else {
|
||||||
collectionKeyDomainResult = null;
|
collectionKeyDomainResult = null;
|
||||||
}
|
}
|
||||||
return new SelectEagerCollectionFetch( fetchablePath, this, collectionKeyDomainResult, fetchParent );
|
return buildSelectEagerCollectionFetch( fetchablePath, this, collectionKeyDomainResult, fetchParent );
|
||||||
}
|
}
|
||||||
|
|
||||||
private TableGroup resolveCollectionTableGroup(
|
private TableGroup resolveCollectionTableGroup(
|
||||||
|
@ -531,7 +598,7 @@ public class PluralAttributeMappingImpl
|
||||||
creationState
|
creationState
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return new DelayedCollectionFetch(
|
return buildDelayedCollectionFetch(
|
||||||
fetchablePath,
|
fetchablePath,
|
||||||
this,
|
this,
|
||||||
fetchParent,
|
fetchParent,
|
||||||
|
|
|
@ -157,32 +157,29 @@ public class ToOneAttributeMapping
|
||||||
private String identifyingColumnsTableExpression;
|
private String identifyingColumnsTableExpression;
|
||||||
private boolean canUseParentTableGroup;
|
private boolean canUseParentTableGroup;
|
||||||
|
|
||||||
protected ToOneAttributeMapping(ToOneAttributeMapping delegate) {
|
// For Hibernate Reactive
|
||||||
super(
|
protected ToOneAttributeMapping(ToOneAttributeMapping original) {
|
||||||
delegate.getAttributeName(),
|
super( original );
|
||||||
delegate.getStateArrayPosition(),
|
navigableRole = original.navigableRole;
|
||||||
delegate.getFetchableKey(),
|
isInternalLoadNullable = original.isInternalLoadNullable;
|
||||||
delegate.getAttributeMetadata(),
|
notFoundAction = original.notFoundAction;
|
||||||
delegate.getMappedFetchOptions(),
|
unwrapProxy = original.unwrapProxy;
|
||||||
delegate.getDeclaringType(),
|
isOptional = original.isOptional;
|
||||||
delegate.getPropertyAccess()
|
entityMappingType = original.entityMappingType;
|
||||||
);
|
referencedPropertyName = original.referencedPropertyName;
|
||||||
navigableRole = delegate.navigableRole;
|
targetKeyPropertyName = original.targetKeyPropertyName;
|
||||||
isInternalLoadNullable = delegate.isInternalLoadNullable;
|
cardinality = original.cardinality;
|
||||||
notFoundAction = delegate.notFoundAction;
|
bidirectionalAttributePath = original.bidirectionalAttributePath;
|
||||||
unwrapProxy = delegate.unwrapProxy;
|
declaringTableGroupProducer = original.declaringTableGroupProducer;
|
||||||
isOptional = delegate.isOptional;
|
isKeyTableNullable = original.isKeyTableNullable;
|
||||||
entityMappingType = delegate.entityMappingType;
|
sqlAliasStem = original.sqlAliasStem;
|
||||||
referencedPropertyName = delegate.referencedPropertyName;
|
targetKeyPropertyNames = original.targetKeyPropertyNames;
|
||||||
targetKeyPropertyName = delegate.targetKeyPropertyName;
|
isNullable = original.isNullable;
|
||||||
cardinality = delegate.cardinality;
|
foreignKeyDescriptor = original.foreignKeyDescriptor;
|
||||||
bidirectionalAttributePath = delegate.bidirectionalAttributePath;
|
sideNature = original.sideNature;
|
||||||
declaringTableGroupProducer = delegate.declaringTableGroupProducer;
|
identifyingColumnsTableExpression = original.identifyingColumnsTableExpression;
|
||||||
isKeyTableNullable = delegate.isKeyTableNullable;
|
canUseParentTableGroup = original.canUseParentTableGroup;
|
||||||
sqlAliasStem = delegate.sqlAliasStem;
|
|
||||||
targetKeyPropertyNames = delegate.targetKeyPropertyNames;
|
|
||||||
isNullable = delegate.isNullable;
|
|
||||||
foreignKeyDescriptor = delegate.foreignKeyDescriptor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ToOneAttributeMapping(
|
public ToOneAttributeMapping(
|
||||||
|
@ -1186,7 +1183,7 @@ public class ToOneAttributeMapping
|
||||||
final FromClauseAccess fromClauseAccess = creationState.getSqlAstCreationState().getFromClauseAccess();
|
final FromClauseAccess fromClauseAccess = creationState.getSqlAstCreationState().getFromClauseAccess();
|
||||||
final TableGroup tableGroup = fromClauseAccess.getTableGroup( referencedNavigablePath );
|
final TableGroup tableGroup = fromClauseAccess.getTableGroup( referencedNavigablePath );
|
||||||
fromClauseAccess.registerTableGroup( fetchablePath, tableGroup );
|
fromClauseAccess.registerTableGroup( fetchablePath, tableGroup );
|
||||||
return new EntityFetchJoinedImpl(
|
return buildEntityFetchJoined(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
tableGroup,
|
tableGroup,
|
||||||
|
@ -1216,7 +1213,7 @@ public class ToOneAttributeMapping
|
||||||
creationState
|
creationState
|
||||||
);
|
);
|
||||||
if ( fetchTiming == FetchTiming.IMMEDIATE ) {
|
if ( fetchTiming == FetchTiming.IMMEDIATE ) {
|
||||||
return new EntityFetchSelectImpl(
|
return buildEntityFetchSelect(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
fetchablePath,
|
fetchablePath,
|
||||||
|
@ -1226,7 +1223,7 @@ public class ToOneAttributeMapping
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new EntityDelayedFetchImpl(
|
return buildEntityDelayedFetch(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
fetchablePath,
|
fetchablePath,
|
||||||
|
@ -1236,6 +1233,52 @@ public class ToOneAttributeMapping
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EntityFetch buildEntityDelayedFetch(
|
||||||
|
FetchParent fetchParent,
|
||||||
|
ToOneAttributeMapping fetchedAttribute,
|
||||||
|
NavigablePath navigablePath,
|
||||||
|
DomainResult<?> keyResult,
|
||||||
|
boolean selectByUniqueKey) {
|
||||||
|
return new EntityDelayedFetchImpl( fetchParent, fetchedAttribute, navigablePath, keyResult, selectByUniqueKey );
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EntityFetch buildEntityFetchSelect(
|
||||||
|
FetchParent fetchParent,
|
||||||
|
ToOneAttributeMapping fetchedAttribute,
|
||||||
|
NavigablePath navigablePath,
|
||||||
|
DomainResult<?> keyResult,
|
||||||
|
boolean selectByUniqueKey,
|
||||||
|
@SuppressWarnings("unused") DomainResultCreationState creationState) {
|
||||||
|
return new EntityFetchSelectImpl(
|
||||||
|
fetchParent,
|
||||||
|
fetchedAttribute,
|
||||||
|
navigablePath,
|
||||||
|
keyResult,
|
||||||
|
selectByUniqueKey,
|
||||||
|
creationState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EntityFetch buildEntityFetchJoined(
|
||||||
|
FetchParent fetchParent,
|
||||||
|
ToOneAttributeMapping toOneMapping,
|
||||||
|
TableGroup tableGroup,
|
||||||
|
DomainResult<?> keyResult,
|
||||||
|
NavigablePath navigablePath,
|
||||||
|
DomainResultCreationState creationState) {
|
||||||
|
return new EntityFetchJoinedImpl(
|
||||||
|
fetchParent,
|
||||||
|
toOneMapping,
|
||||||
|
tableGroup,
|
||||||
|
keyResult,
|
||||||
|
navigablePath,
|
||||||
|
creationState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private NavigablePath getReferencedNavigablePath(
|
private NavigablePath getReferencedNavigablePath(
|
||||||
DomainResultCreationState creationState,
|
DomainResultCreationState creationState,
|
||||||
NavigablePath parentNavigablePath) {
|
NavigablePath parentNavigablePath) {
|
||||||
|
@ -1385,7 +1428,7 @@ public class ToOneAttributeMapping
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new EntityFetchJoinedImpl(
|
return buildEntityFetchJoined(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
tableGroup,
|
tableGroup,
|
||||||
|
@ -1443,7 +1486,7 @@ public class ToOneAttributeMapping
|
||||||
|
|
||||||
// Consider all associations annotated with @NotFound as EAGER
|
// Consider all associations annotated with @NotFound as EAGER
|
||||||
if ( fetchTiming == FetchTiming.IMMEDIATE || hasNotFoundAction() ) {
|
if ( fetchTiming == FetchTiming.IMMEDIATE || hasNotFoundAction() ) {
|
||||||
return new EntityFetchSelectImpl(
|
return buildEntityFetchSelect(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
fetchablePath,
|
fetchablePath,
|
||||||
|
@ -1453,7 +1496,7 @@ public class ToOneAttributeMapping
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new EntityDelayedFetchImpl(
|
return buildEntityDelayedFetch(
|
||||||
fetchParent,
|
fetchParent,
|
||||||
this,
|
this,
|
||||||
fetchablePath,
|
fetchablePath,
|
||||||
|
|
|
@ -5420,7 +5420,7 @@ public abstract class AbstractEntityPersister
|
||||||
dependantValue = ( (DependantValue) bootProperty.getValue() );
|
dependantValue = ( (DependantValue) bootProperty.getValue() );
|
||||||
}
|
}
|
||||||
|
|
||||||
return MappingModelCreationHelper.buildEmbeddedAttributeMapping(
|
return buildEmbeddedAttributeMapping(
|
||||||
attrName,
|
attrName,
|
||||||
stateArrayPosition,
|
stateArrayPosition,
|
||||||
fetchableIndex,
|
fetchableIndex,
|
||||||
|
@ -5437,7 +5437,7 @@ public abstract class AbstractEntityPersister
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else if ( attrType instanceof CollectionType ) {
|
else if ( attrType instanceof CollectionType ) {
|
||||||
return MappingModelCreationHelper.buildPluralAttributeMapping(
|
return buildPluralAttributeMapping(
|
||||||
attrName,
|
attrName,
|
||||||
stateArrayPosition,
|
stateArrayPosition,
|
||||||
fetchableIndex,
|
fetchableIndex,
|
||||||
|
@ -5450,7 +5450,7 @@ public abstract class AbstractEntityPersister
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else if ( attrType instanceof EntityType ) {
|
else if ( attrType instanceof EntityType ) {
|
||||||
return MappingModelCreationHelper.buildSingularAssociationAttributeMapping(
|
return buildSingularAssociationAttributeMapping(
|
||||||
attrName,
|
attrName,
|
||||||
getNavigableRole().append( attrName ),
|
getNavigableRole().append( attrName ),
|
||||||
stateArrayPosition,
|
stateArrayPosition,
|
||||||
|
@ -5470,6 +5470,90 @@ public abstract class AbstractEntityPersister
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EmbeddedAttributeMapping buildEmbeddedAttributeMapping(
|
||||||
|
String attrName,
|
||||||
|
int stateArrayPosition,
|
||||||
|
int fetchableIndex,
|
||||||
|
Property bootProperty,
|
||||||
|
DependantValue dependantValue,
|
||||||
|
int dependantColumnIndex,
|
||||||
|
ManagedMappingType declaringType,
|
||||||
|
CompositeType attrType,
|
||||||
|
String tableExpression,
|
||||||
|
String[] rootTableKeyColumnNames,
|
||||||
|
PropertyAccess propertyAccess,
|
||||||
|
CascadeStyle cascadeStyle,
|
||||||
|
MappingModelCreationProcess creationProcess) {
|
||||||
|
return MappingModelCreationHelper.buildEmbeddedAttributeMapping(
|
||||||
|
attrName,
|
||||||
|
stateArrayPosition,
|
||||||
|
fetchableIndex,
|
||||||
|
bootProperty,
|
||||||
|
dependantValue,
|
||||||
|
dependantColumnIndex,
|
||||||
|
declaringType,
|
||||||
|
attrType,
|
||||||
|
tableExpression,
|
||||||
|
rootTableKeyColumnNames,
|
||||||
|
propertyAccess,
|
||||||
|
cascadeStyle,
|
||||||
|
creationProcess
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected AttributeMapping buildSingularAssociationAttributeMapping(
|
||||||
|
String attrName,
|
||||||
|
NavigableRole navigableRole,
|
||||||
|
int stateArrayPosition,
|
||||||
|
int fetchableIndex,
|
||||||
|
Property bootProperty,
|
||||||
|
ManagedMappingType declaringType,
|
||||||
|
EntityPersister declaringEntityPersister,
|
||||||
|
EntityType attrType,
|
||||||
|
PropertyAccess propertyAccess,
|
||||||
|
CascadeStyle cascadeStyle,
|
||||||
|
MappingModelCreationProcess creationProcess) {
|
||||||
|
return MappingModelCreationHelper.buildSingularAssociationAttributeMapping(
|
||||||
|
attrName,
|
||||||
|
navigableRole,
|
||||||
|
stateArrayPosition,
|
||||||
|
fetchableIndex,
|
||||||
|
bootProperty,
|
||||||
|
declaringType,
|
||||||
|
declaringEntityPersister,
|
||||||
|
attrType,
|
||||||
|
propertyAccess,
|
||||||
|
cascadeStyle,
|
||||||
|
creationProcess
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected AttributeMapping buildPluralAttributeMapping(
|
||||||
|
String attrName,
|
||||||
|
int stateArrayPosition,
|
||||||
|
int fetchableIndex,
|
||||||
|
Property bootProperty,
|
||||||
|
ManagedMappingType declaringType,
|
||||||
|
PropertyAccess propertyAccess,
|
||||||
|
CascadeStyle cascadeStyle,
|
||||||
|
FetchMode fetchMode,
|
||||||
|
MappingModelCreationProcess creationProcess) {
|
||||||
|
return MappingModelCreationHelper.buildPluralAttributeMapping(
|
||||||
|
attrName,
|
||||||
|
stateArrayPosition,
|
||||||
|
fetchableIndex,
|
||||||
|
bootProperty,
|
||||||
|
declaringType,
|
||||||
|
propertyAccess,
|
||||||
|
cascadeStyle,
|
||||||
|
fetchMode,
|
||||||
|
creationProcess
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JavaType<?> getMappedJavaType() {
|
public JavaType<?> getMappedJavaType() {
|
||||||
return javaType;
|
return javaType;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.sql.results.graph.entity.internal;
|
package org.hibernate.sql.results.graph.entity.internal;
|
||||||
|
|
||||||
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.annotations.NotFoundAction;
|
import org.hibernate.annotations.NotFoundAction;
|
||||||
import org.hibernate.engine.FetchTiming;
|
import org.hibernate.engine.FetchTiming;
|
||||||
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
|
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
|
||||||
|
@ -15,10 +16,14 @@ import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||||
import org.hibernate.sql.results.graph.DomainResult;
|
import org.hibernate.sql.results.graph.DomainResult;
|
||||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||||
|
import org.hibernate.sql.results.graph.Fetch;
|
||||||
import org.hibernate.sql.results.graph.FetchParent;
|
import org.hibernate.sql.results.graph.FetchParent;
|
||||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||||
|
import org.hibernate.sql.results.graph.Initializer;
|
||||||
import org.hibernate.sql.results.graph.entity.AbstractNonLazyEntityFetch;
|
import org.hibernate.sql.results.graph.entity.AbstractNonLazyEntityFetch;
|
||||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||||
|
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
|
||||||
|
import org.hibernate.sql.results.graph.entity.EntityValuedFetchable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
||||||
|
@ -74,6 +79,15 @@ public class EntityFetchJoinedImpl extends AbstractNonLazyEntityFetch {
|
||||||
this.entityResult.afterInitialize( this, creationState );
|
this.entityResult.afterInitialize( this, creationState );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected EntityFetchJoinedImpl(EntityFetchJoinedImpl original ) {
|
||||||
|
super( original.getFetchParent(), original.getReferencedModePart(), original.getNavigablePath() );
|
||||||
|
this.entityResult = original.entityResult;
|
||||||
|
this.keyResult = original.keyResult;
|
||||||
|
this.notFoundAction = original.notFoundAction;
|
||||||
|
this.sourceAlias = original.sourceAlias;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected EntityInitializer getEntityInitializer(
|
protected EntityInitializer getEntityInitializer(
|
||||||
FetchParentAccess parentAccess,
|
FetchParentAccess parentAccess,
|
||||||
|
@ -81,7 +95,7 @@ public class EntityFetchJoinedImpl extends AbstractNonLazyEntityFetch {
|
||||||
return creationState.resolveInitializer(
|
return creationState.resolveInitializer(
|
||||||
getNavigablePath(),
|
getNavigablePath(),
|
||||||
getReferencedModePart(),
|
getReferencedModePart(),
|
||||||
() -> new EntityJoinedFetchInitializer(
|
() -> buildEntityJoinedFetchInitializer(
|
||||||
entityResult,
|
entityResult,
|
||||||
getReferencedModePart(),
|
getReferencedModePart(),
|
||||||
getNavigablePath(),
|
getNavigablePath(),
|
||||||
|
@ -95,6 +109,30 @@ public class EntityFetchJoinedImpl extends AbstractNonLazyEntityFetch {
|
||||||
).asEntityInitializer();
|
).asEntityInitializer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For Hibernate Reactive
|
||||||
|
protected Initializer buildEntityJoinedFetchInitializer(
|
||||||
|
EntityResultGraphNode resultDescriptor,
|
||||||
|
EntityValuedFetchable referencedFetchable,
|
||||||
|
NavigablePath navigablePath,
|
||||||
|
LockMode lockMode,
|
||||||
|
NotFoundAction notFoundAction,
|
||||||
|
DomainResult<?> keyResult,
|
||||||
|
Fetch identifierFetch,
|
||||||
|
Fetch discriminatorFetch,
|
||||||
|
AssemblerCreationState creationState) {
|
||||||
|
return new EntityJoinedFetchInitializer(
|
||||||
|
resultDescriptor,
|
||||||
|
referencedFetchable,
|
||||||
|
navigablePath,
|
||||||
|
lockMode,
|
||||||
|
notFoundAction,
|
||||||
|
keyResult,
|
||||||
|
identifierFetch,
|
||||||
|
discriminatorFetch,
|
||||||
|
creationState
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FetchTiming getTiming() {
|
public FetchTiming getTiming() {
|
||||||
return FetchTiming.IMMEDIATE;
|
return FetchTiming.IMMEDIATE;
|
||||||
|
|
Loading…
Reference in New Issue