HHH-15893 - Clean-up NaturalIdMapping for API
HHH-15894 - Clean-up EntityMappingType for API
This commit is contained in:
parent
c21fef3a66
commit
1715f09a89
|
@ -130,7 +130,7 @@ class DatabaseSnapshotExecutor {
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
entityDescriptor.visitAttributeMappings(
|
entityDescriptor.forEachAttributeMapping(
|
||||||
attributeMapping -> {
|
attributeMapping -> {
|
||||||
final NavigablePath navigablePath = rootPath.append( attributeMapping.getAttributeName() );
|
final NavigablePath navigablePath = rootPath.append( attributeMapping.getAttributeName() );
|
||||||
domainResults.add(
|
domainResults.add(
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class SingleIdEntityLoaderProvidedQueryImpl<T> implements SingleIdEntityL
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
final QueryImplementor<T> query = namedQueryMemento.toQuery(
|
final QueryImplementor<T> query = namedQueryMemento.toQuery(
|
||||||
session,
|
session,
|
||||||
entityDescriptor.getMappedJavaType().getJavaTypeClass()
|
(Class<T>) entityDescriptor.getMappedJavaType().getJavaTypeClass()
|
||||||
);
|
);
|
||||||
|
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
|
|
|
@ -20,6 +20,9 @@ import org.hibernate.sql.ast.tree.predicate.Predicate;
|
||||||
* the associated entity
|
* the associated entity
|
||||||
*/
|
*/
|
||||||
public interface Discriminatable {
|
public interface Discriminatable {
|
||||||
|
/**
|
||||||
|
* Apply the discriminator as a predicate via the {@code predicateConsumer}
|
||||||
|
*/
|
||||||
void applyDiscriminator(
|
void applyDiscriminator(
|
||||||
Consumer<Predicate> predicateConsumer,
|
Consumer<Predicate> predicateConsumer,
|
||||||
String alias,
|
String alias,
|
||||||
|
|
|
@ -14,7 +14,6 @@ import org.hibernate.mapping.IndexedConsumer;
|
||||||
import org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping;
|
import org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping;
|
||||||
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
|
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
|
||||||
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
|
||||||
import org.hibernate.property.access.spi.Getter;
|
import org.hibernate.property.access.spi.Getter;
|
||||||
import org.hibernate.spi.NavigablePath;
|
import org.hibernate.spi.NavigablePath;
|
||||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
import org.hibernate.sql.ast.spi.SqlSelection;
|
||||||
|
@ -237,7 +236,7 @@ public interface EmbeddableMappingType extends ManagedMappingType, SelectableMap
|
||||||
NavigablePath navigablePath,
|
NavigablePath navigablePath,
|
||||||
TableGroup tableGroup,
|
TableGroup tableGroup,
|
||||||
DomainResultCreationState creationState) {
|
DomainResultCreationState creationState) {
|
||||||
visitAttributeMappings(
|
forEachAttributeMapping(
|
||||||
attributeMapping -> attributeMapping.applySqlSelections( navigablePath, tableGroup, creationState )
|
attributeMapping -> attributeMapping.applySqlSelections( navigablePath, tableGroup, creationState )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -248,7 +247,7 @@ public interface EmbeddableMappingType extends ManagedMappingType, SelectableMap
|
||||||
TableGroup tableGroup,
|
TableGroup tableGroup,
|
||||||
DomainResultCreationState creationState,
|
DomainResultCreationState creationState,
|
||||||
BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) {
|
BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) {
|
||||||
visitAttributeMappings(
|
forEachAttributeMapping(
|
||||||
attributeMapping ->
|
attributeMapping ->
|
||||||
attributeMapping.applySqlSelections(
|
attributeMapping.applySqlSelections(
|
||||||
navigablePath,
|
navigablePath,
|
||||||
|
|
|
@ -11,74 +11,81 @@ import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.hibernate.Filter;
|
import org.hibernate.Filter;
|
||||||
|
import org.hibernate.Internal;
|
||||||
|
import org.hibernate.boot.jaxb.mapping.JaxbEntity;
|
||||||
|
import org.hibernate.engine.OptimisticLockStyle;
|
||||||
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
|
||||||
import org.hibernate.loader.ast.spi.Loadable;
|
import org.hibernate.loader.ast.spi.Loadable;
|
||||||
import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
||||||
import org.hibernate.loader.ast.spi.NaturalIdLoader;
|
import org.hibernate.loader.ast.spi.NaturalIdLoader;
|
||||||
import org.hibernate.mapping.IndexedConsumer;
|
import org.hibernate.mapping.Contributable;
|
||||||
import org.hibernate.metamodel.UnsupportedMappingException;
|
import org.hibernate.metamodel.UnsupportedMappingException;
|
||||||
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
||||||
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
|
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
|
||||||
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsMap;
|
import org.hibernate.persister.entity.AttributeMappingsMap;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
|
||||||
import org.hibernate.spi.NavigablePath;
|
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
||||||
|
import org.hibernate.spi.NavigablePath;
|
||||||
import org.hibernate.sql.ast.spi.FromClauseAccess;
|
import org.hibernate.sql.ast.spi.FromClauseAccess;
|
||||||
import org.hibernate.sql.ast.spi.SqlAliasBase;
|
import org.hibernate.sql.ast.spi.SqlAliasBase;
|
||||||
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||||
import org.hibernate.sql.ast.spi.SqlAstCreationState;
|
import org.hibernate.sql.ast.spi.SqlAstCreationState;
|
||||||
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
||||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.TableReference;
|
import org.hibernate.sql.ast.tree.from.TableReference;
|
||||||
import org.hibernate.sql.ast.tree.from.TableReferenceJoin;
|
import org.hibernate.sql.ast.tree.from.TableReferenceJoin;
|
||||||
import org.hibernate.sql.ast.tree.predicate.Predicate;
|
import org.hibernate.sql.ast.tree.predicate.Predicate;
|
||||||
import org.hibernate.sql.results.graph.DomainResult;
|
|
||||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
|
||||||
import org.hibernate.sql.results.graph.Fetchable;
|
import org.hibernate.sql.results.graph.Fetchable;
|
||||||
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
|
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
|
||||||
import static org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer.UNFETCHED_PROPERTY;
|
import static org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer.UNFETCHED_PROPERTY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mapping of an entity
|
* Mapping of an entity
|
||||||
*
|
*
|
||||||
* @see jakarta.persistence.Entity
|
* @see jakarta.persistence.Entity
|
||||||
|
* @see jakarta.persistence.metamodel.EntityType
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface EntityMappingType
|
public interface EntityMappingType
|
||||||
extends ManagedMappingType, EntityValuedModelPart, Loadable, Restrictable, Discriminatable {
|
extends ManagedMappingType, EntityValuedModelPart, Loadable, Restrictable, Discriminatable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Safety-net.
|
* The entity name.
|
||||||
|
* <p/>
|
||||||
|
* For most entities, this will be the fully-qualified name
|
||||||
|
* of the entity class. The alternative is an explicit
|
||||||
|
* {@linkplain JaxbEntity#getName() entity-name} which takes precedence if provided
|
||||||
*
|
*
|
||||||
* todo (6.0) : do we really need to expose?
|
* @apiNote Different from {@link Entity#name()}, which is just a glorified
|
||||||
|
* SQM "import" name
|
||||||
*/
|
*/
|
||||||
EntityPersister getEntityPersister();
|
String getEntityName();
|
||||||
|
|
||||||
default String getContributor() {
|
|
||||||
// todo (6.0) : needed for the HHH-14470 half related to HHH-14469
|
|
||||||
return "orm";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes how the entity is represented in the application's domain model.
|
||||||
|
*/
|
||||||
default EntityRepresentationStrategy getRepresentationStrategy() {
|
default EntityRepresentationStrategy getRepresentationStrategy() {
|
||||||
return getEntityPersister().getRepresentationStrategy();
|
return getEntityPersister().getRepresentationStrategy();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getEntityName();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Details for the table this persister maps.
|
* Details for the table this entity maps. Generally this is the
|
||||||
|
* same as {@link #getIdentifierTableDetails()}, though may be different
|
||||||
|
* for subtypes in {@linkplain jakarta.persistence.InheritanceType#JOINED joined}
|
||||||
|
* and{@linkplain jakarta.persistence.InheritanceType#TABLE_PER_CLASS union}
|
||||||
|
* inheritance hierarchies
|
||||||
*
|
*
|
||||||
* @see #getIdentifierTableDetails()
|
* @see #getIdentifierTableDetails()
|
||||||
*/
|
*/
|
||||||
|
@ -95,16 +102,6 @@ public interface EntityMappingType
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getPartName() {
|
|
||||||
return getEntityName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getRootPathName() {
|
|
||||||
return getEntityName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default JavaType<?> getJavaType() {
|
default JavaType<?> getJavaType() {
|
||||||
return getMappedJavaType();
|
return getMappedJavaType();
|
||||||
|
@ -115,6 +112,12 @@ public interface EntityMappingType
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visit each "query space" for the mapped entity.
|
||||||
|
*
|
||||||
|
* @apiNote "Query space" is simply the table expressions to
|
||||||
|
* which the entity is mapped; the name is historical.
|
||||||
|
*/
|
||||||
void visitQuerySpaces(Consumer<String> querySpaceConsumer);
|
void visitQuerySpaces(Consumer<String> querySpaceConsumer);
|
||||||
|
|
||||||
|
|
||||||
|
@ -130,62 +133,43 @@ public interface EntityMappingType
|
||||||
return findSubPart( name, treatTargetType );
|
return findSubPart( name, treatTargetType );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
ModelPart findSubPart(String name, EntityMappingType targetType);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
void visitSubParts(Consumer<ModelPart> consumer, EntityMappingType targetType);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
<T> DomainResult<T> createDomainResult(
|
|
||||||
NavigablePath navigablePath,
|
|
||||||
TableGroup tableGroup,
|
|
||||||
String resultVariable,
|
|
||||||
DomainResultCreationState creationState);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
void applySqlSelections(
|
|
||||||
NavigablePath navigablePath,
|
|
||||||
TableGroup tableGroup,
|
|
||||||
DomainResultCreationState creationState);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
void applySqlSelections(
|
|
||||||
NavigablePath navigablePath,
|
|
||||||
TableGroup tableGroup,
|
|
||||||
DomainResultCreationState creationState,
|
|
||||||
BiConsumer<SqlSelection,JdbcMapping> selectionConsumer);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default int getJdbcTypeCount() {
|
default int getJdbcTypeCount() {
|
||||||
return forEachJdbcType( (index, jdbcMapping) -> {} );
|
return forEachJdbcType( (index, jdbcMapping) -> {} );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
int forEachJdbcType(int offset, IndexedConsumer<JdbcMapping> action);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
Object disassemble(Object value, SharedSessionContractImplementor session);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
int forEachDisassembledJdbcValue(
|
|
||||||
Object value,
|
|
||||||
int offset,
|
|
||||||
JdbcValuesConsumer valuesConsumer,
|
|
||||||
SharedSessionContractImplementor session);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default int forEachJdbcValue(
|
|
||||||
Object value,
|
|
||||||
int offset,
|
|
||||||
JdbcValuesConsumer consumer,
|
|
||||||
SharedSessionContractImplementor session) {
|
|
||||||
return forEachDisassembledJdbcValue( disassemble( value, session ), offset, consumer, session );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
// Inheritance
|
// Inheritance
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this entity is defined as abstract using the Java {@code abstract} keyword
|
||||||
|
*/
|
||||||
|
default boolean isAbstract() {
|
||||||
|
return getEntityPersister().getEntityMetamodel().isAbstract();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this entity mapping has any subtype mappings
|
||||||
|
*/
|
||||||
|
default boolean hasSubclasses() {
|
||||||
|
return getEntityPersister().getEntityMetamodel().hasSubclasses();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The mapping for the entity which is the supertype for this entity
|
||||||
|
* mapping.
|
||||||
|
*
|
||||||
|
* @return The supertype mapping, or {@code null} if there is no
|
||||||
|
* supertype
|
||||||
|
*
|
||||||
|
* @apiNote This need not be the direct superclass of the entity as it
|
||||||
|
* is driven by mapping.
|
||||||
|
*/
|
||||||
|
default EntityMappingType getSuperMappingType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the entity that is the "super class" for this entity
|
* Get the name of the entity that is the "super class" for this entity
|
||||||
*
|
*
|
||||||
|
@ -195,12 +179,47 @@ public interface EntityMappingType
|
||||||
return getSuperMappingType().getEntityName();
|
return getSuperMappingType().getEntityName();
|
||||||
}
|
}
|
||||||
|
|
||||||
default int getSubclassId() {
|
/**
|
||||||
return getEntityPersister().getEntityMetamodel().getSubclassId();
|
* Retrieve mappings for all subtypes
|
||||||
|
*/
|
||||||
|
default Collection<EntityMappingType> getSubMappingTypes() {
|
||||||
|
final MappingMetamodelImplementor mappingMetamodel = getEntityPersister().getFactory().getMappingMetamodel();
|
||||||
|
final Set<String> subclassEntityNames = getSubclassEntityNames();
|
||||||
|
final List<EntityMappingType> mappingTypes = new ArrayList<>( subclassEntityNames.size() );
|
||||||
|
for ( String subclassEntityName : subclassEntityNames ) {
|
||||||
|
mappingTypes.add( mappingMetamodel.getEntityDescriptor( subclassEntityName ) );
|
||||||
|
}
|
||||||
|
return mappingTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
default boolean hasSubclasses() {
|
/**
|
||||||
return getEntityPersister().getEntityMetamodel().hasSubclasses();
|
* Whether the passed entity mapping is the same as or is a supertype of
|
||||||
|
* this entity mapping
|
||||||
|
*/
|
||||||
|
default boolean isTypeOrSuperType(EntityMappingType targetType) {
|
||||||
|
return targetType == this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the passed mapping is (1) an entity mapping and (2) the same as or
|
||||||
|
* a supertype of this entity mapping
|
||||||
|
*
|
||||||
|
* @see #isTypeOrSuperType(EntityMappingType)
|
||||||
|
*/
|
||||||
|
default boolean isTypeOrSuperType(ManagedMappingType targetType) {
|
||||||
|
if ( targetType instanceof EntityMappingType ) {
|
||||||
|
return isTypeOrSuperType( (EntityMappingType) targetType );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A value that uniquely identifies an entity mapping relative to its
|
||||||
|
* inheritance hierarchy
|
||||||
|
*/
|
||||||
|
default int getSubclassId() {
|
||||||
|
return getEntityPersister().getEntityMetamodel().getSubclassId();
|
||||||
}
|
}
|
||||||
|
|
||||||
default Set<String> getSubclassEntityNames() {
|
default Set<String> getSubclassEntityNames() {
|
||||||
|
@ -212,111 +231,15 @@ public interface EntityMappingType
|
||||||
*/
|
*/
|
||||||
boolean isExplicitPolymorphism();
|
boolean isExplicitPolymorphism();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The discriminator value which indicates this entity mapping
|
||||||
|
*/
|
||||||
Object getDiscriminatorValue();
|
Object getDiscriminatorValue();
|
||||||
|
|
||||||
default String getDiscriminatorSQLValue() {
|
default String getDiscriminatorSQLValue() {
|
||||||
return getDiscriminatorValue().toString();
|
return getDiscriminatorValue().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getSubclassForDiscriminatorValue(Object value);
|
|
||||||
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// Attribute mappings
|
|
||||||
|
|
||||||
AttributeMapping findDeclaredAttributeMapping(String name);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the number of attributes defined on this class - do not access attributes defined on the super
|
|
||||||
*/
|
|
||||||
default int getNumberOfDeclaredAttributeMappings() {
|
|
||||||
return getDeclaredAttributeMappings().size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get access to the attributes defined on this class - do not access attributes defined on the super
|
|
||||||
*/
|
|
||||||
AttributeMappingsMap getDeclaredAttributeMappings();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Visit attributes defined on this class - do not visit attributes defined on the super
|
|
||||||
*/
|
|
||||||
void visitDeclaredAttributeMappings(Consumer<? super AttributeMapping> action);
|
|
||||||
|
|
||||||
default EntityMappingType getSuperMappingType() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
default Collection<EntityMappingType> getSubMappingTypes() {
|
|
||||||
final MappingMetamodelImplementor mappingMetamodel = getEntityPersister().getFactory().getMappingMetamodel();
|
|
||||||
final Set<String> subclassEntityNames = getSubclassEntityNames();
|
|
||||||
final List<EntityMappingType> mappingTypes = new ArrayList<>( subclassEntityNames.size() );
|
|
||||||
for ( String subclassEntityName : subclassEntityNames ) {
|
|
||||||
mappingTypes.add( mappingMetamodel.getEntityDescriptor( subclassEntityName ) );
|
|
||||||
}
|
|
||||||
return mappingTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean isTypeOrSuperType(EntityMappingType targetType) {
|
|
||||||
return targetType == this;
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean isTypeOrSuperType(ManagedMappingType targetType) {
|
|
||||||
if ( targetType instanceof EntityMappingType ) {
|
|
||||||
return isTypeOrSuperType( (EntityMappingType) targetType );
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
default SqmMultiTableMutationStrategy getSqmMultiTableMutationStrategy(){
|
|
||||||
return getEntityPersister().getSqmMultiTableMutationStrategy();
|
|
||||||
}
|
|
||||||
|
|
||||||
default SqmMultiTableInsertStrategy getSqmMultiTableInsertStrategy() {
|
|
||||||
return getEntityPersister().getSqmMultiTableInsertStrategy();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// Special model parts - identifier, discriminator, etc
|
|
||||||
|
|
||||||
EntityIdentifierMapping getIdentifierMapping();
|
|
||||||
|
|
||||||
EntityDiscriminatorMapping getDiscriminatorMapping();
|
|
||||||
|
|
||||||
EntityVersionMapping getVersionMapping();
|
|
||||||
|
|
||||||
NaturalIdMapping getNaturalIdMapping();
|
|
||||||
|
|
||||||
EntityRowIdMapping getRowIdMapping();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Visit the mappings, but limited to just attributes defined
|
|
||||||
* in the targetType or its super-type(s) if any.
|
|
||||||
*
|
|
||||||
* @apiNote Passing {@code null} indicates that subclasses should be included. This
|
|
||||||
* matches legacy non-TREAT behavior and meets the need for EntityGraph processing
|
|
||||||
*/
|
|
||||||
default void visitAttributeMappings(Consumer<? super AttributeMapping> action, EntityMappingType targetType) {
|
|
||||||
getAttributeMappings().forEach( action );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Walk this type's attributes as well as its sub-type's
|
|
||||||
*/
|
|
||||||
default void visitSubTypeAttributeMappings(Consumer<? super AttributeMapping> action) {
|
|
||||||
// by default do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Walk this type's attributes as well as its super-type's
|
|
||||||
*/
|
|
||||||
default void visitSuperTypeAttributeMappings(Consumer<? super AttributeMapping> action) {
|
|
||||||
// by default do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
void visitConstraintOrderedTables(ConstraintOrderedTableConsumer consumer);
|
|
||||||
|
|
||||||
|
|
||||||
default EntityMappingType getRootEntityDescriptor() {
|
default EntityMappingType getRootEntityDescriptor() {
|
||||||
final EntityMappingType superMappingType = getSuperMappingType();
|
final EntityMappingType superMappingType = getSuperMappingType();
|
||||||
|
@ -354,20 +277,149 @@ public interface EntityMappingType
|
||||||
default void pruneForSubclasses(TableGroup tableGroup, Set<String> treatedEntityNames) {
|
default void pruneForSubclasses(TableGroup tableGroup, Set<String> treatedEntityNames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
default boolean isAbstract() {
|
|
||||||
return getEntityPersister().getEntityMetamodel().isAbstract();
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// Special model parts - identifier, discriminator, etc
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping details for the entity's identifier. This is shared across all
|
||||||
|
* entity mappings within an inheritance hierarchy.
|
||||||
|
*/
|
||||||
|
EntityIdentifierMapping getIdentifierMapping();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping details for the entity's discriminator. This is shared across all
|
||||||
|
* entity mappings within an inheritance hierarchy.
|
||||||
|
*/
|
||||||
|
EntityDiscriminatorMapping getDiscriminatorMapping();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping details for the entity's version when using the
|
||||||
|
* {@linkplain OptimisticLockStyle#VERSION version strategy}.
|
||||||
|
* This is shared across all entity mappings within an inheritance
|
||||||
|
* hierarchy.
|
||||||
|
*
|
||||||
|
* @return The version mapping, or null if the entity is (1) defined
|
||||||
|
* with a strategy other than {@link OptimisticLockStyle#VERSION} or
|
||||||
|
* (2) defined without optimistic locking
|
||||||
|
*
|
||||||
|
* @see #optimisticLockStyle
|
||||||
|
*/
|
||||||
|
EntityVersionMapping getVersionMapping();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of optimistic locking, if any, defined for this entity mapping
|
||||||
|
*/
|
||||||
|
default OptimisticLockStyle optimisticLockStyle() {
|
||||||
|
return OptimisticLockStyle.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The mapping for the natural-id of the entity, if one is defined
|
||||||
|
*/
|
||||||
|
NaturalIdMapping getNaturalIdMapping();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The mapping for the row-id of the entity, if one is defined.
|
||||||
|
*/
|
||||||
|
EntityRowIdMapping getRowIdMapping();
|
||||||
|
|
||||||
|
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// Attribute mappings
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The total number of attributes for this entity, including those
|
||||||
|
* declared on supertype mappings
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
default int getNumberOfAttributeMappings() {
|
||||||
|
return getEntityPersister().getNumberOfAttributeMappings();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes mapping for this entity, including those
|
||||||
|
* declared on supertype mappings
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
default AttributeMappingsList getAttributeMappings() {
|
||||||
|
return getEntityPersister().getAttributeMappings();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visit each {@linkplain #getAttributeMappings() attribute mapping}
|
||||||
|
*
|
||||||
|
* @see #getAttributeMappings()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
default void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
|
getAttributeMappings().forEach( action );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve an attribute mapping by position, relative to
|
||||||
|
* {@linkplain #getAttributeMappings() all attributes}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
default AttributeMapping getAttributeMapping(int position) {
|
||||||
|
return getEntityPersister().getAttributeMapping( position );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find an attribute-mapping, declared on this entity mapping (not super or
|
||||||
|
* subs), by name
|
||||||
|
*/
|
||||||
|
AttributeMapping findDeclaredAttributeMapping(String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of attributes defined on this entity mapping - do not access
|
||||||
|
* attributes defined on the super
|
||||||
|
*/
|
||||||
|
default int getNumberOfDeclaredAttributeMappings() {
|
||||||
|
return getDeclaredAttributeMappings().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get access to the attributes defined on this class - do not access attributes defined on the super
|
||||||
|
*/
|
||||||
|
AttributeMappingsMap getDeclaredAttributeMappings();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visit attributes defined on this class - do not visit attributes defined on the super
|
||||||
|
*/
|
||||||
|
void visitDeclaredAttributeMappings(Consumer<? super AttributeMapping> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visit the mappings, but limited to just attributes defined
|
||||||
|
* in the targetType or its super-type(s) if any.
|
||||||
|
*
|
||||||
|
* @apiNote Passing {@code null} indicates that subclasses should be included. This
|
||||||
|
* matches legacy non-TREAT behavior and meets the need for EntityGraph processing
|
||||||
|
*/
|
||||||
|
default void visitAttributeMappings(Consumer<? super AttributeMapping> action, EntityMappingType targetType) {
|
||||||
|
getAttributeMappings().forEach( action );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk this type's attributes as well as its sub-type's
|
||||||
|
*/
|
||||||
|
default void visitSubTypeAttributeMappings(Consumer<? super AttributeMapping> action) {
|
||||||
|
// by default do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk this type's attributes as well as its super-type's
|
||||||
|
*/
|
||||||
|
default void visitSuperTypeAttributeMappings(Consumer<? super AttributeMapping> action) {
|
||||||
|
// by default do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
void visitConstraintOrderedTables(ConstraintOrderedTableConsumer consumer);
|
||||||
|
|
||||||
interface ConstraintOrderedTableConsumer {
|
interface ConstraintOrderedTableConsumer {
|
||||||
void consume(String tableExpression, Supplier<Consumer<SelectableConsumer>> tableKeyColumnVisitationSupplier);
|
void consume(String tableExpression, Supplier<Consumer<SelectableConsumer>> tableKeyColumnVisitationSupplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
|
||||||
getAttributeMappings().forEach( action );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Customer <- DomesticCustomer <- OtherCustomer
|
// Customer <- DomesticCustomer <- OtherCustomer
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
@Deprecated(forRemoval = true)
|
||||||
|
@ -377,9 +429,9 @@ public interface EntityMappingType
|
||||||
// todo (6.0) : getNumberOfAttributeMappings() needs to be fixed for this to work - bad walking of hierarchy
|
// todo (6.0) : getNumberOfAttributeMappings() needs to be fixed for this to work - bad walking of hierarchy
|
||||||
final Object[] values = new Object[ getNumberOfAttributeMappings() ];
|
final Object[] values = new Object[ getNumberOfAttributeMappings() ];
|
||||||
|
|
||||||
visitAttributeMappings(
|
forEachAttributeMapping(
|
||||||
attribute -> {
|
attribute -> {
|
||||||
final DomainResultAssembler assembler = assemblerMapping.get( attribute );
|
final DomainResultAssembler<?> assembler = assemblerMapping.get( attribute );
|
||||||
final Object value;
|
final Object value;
|
||||||
if ( assembler == null ) {
|
if ( assembler == null ) {
|
||||||
value = UNFETCHED_PROPERTY;
|
value = UNFETCHED_PROPERTY;
|
||||||
|
@ -430,6 +482,27 @@ public interface EntityMappingType
|
||||||
return getEntityPersister().isAffectedByEnabledFetchProfiles( influencers );
|
return getEntityPersister().isAffectedByEnabledFetchProfiles( influencers );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// SQM handling
|
||||||
|
|
||||||
|
default SqmMultiTableMutationStrategy getSqmMultiTableMutationStrategy(){
|
||||||
|
return getEntityPersister().getSqmMultiTableMutationStrategy();
|
||||||
|
}
|
||||||
|
|
||||||
|
default SqmMultiTableInsertStrategy getSqmMultiTableInsertStrategy() {
|
||||||
|
return getEntityPersister().getSqmMultiTableInsertStrategy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// SQL AST generation
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String getSqlAliasStem() {
|
||||||
|
return getEntityPersister().getSqlAliasStem();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default TableGroup createRootTableGroup(
|
default TableGroup createRootTableGroup(
|
||||||
boolean canUseInnerJoins,
|
boolean canUseInnerJoins,
|
||||||
|
@ -495,30 +568,10 @@ public interface EntityMappingType
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default int getNumberOfAttributeMappings() {
|
default JavaType<?> getMappedJavaType() {
|
||||||
return getEntityPersister().getNumberOfAttributeMappings();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default AttributeMappingsList getAttributeMappings() {
|
|
||||||
return getEntityPersister().getAttributeMappings();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default AttributeMapping getAttributeMapping(int position) {
|
|
||||||
return getEntityPersister().getAttributeMapping( position );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default JavaType getMappedJavaType() {
|
|
||||||
return getEntityPersister().getMappedJavaType();
|
return getEntityPersister().getMappedJavaType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
default String getSqlAliasStem() {
|
|
||||||
return getEntityPersister().getSqlAliasStem();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default int getNumberOfFetchables() {
|
default int getNumberOfFetchables() {
|
||||||
return getEntityPersister().getNumberOfFetchables();
|
return getEntityPersister().getNumberOfFetchables();
|
||||||
|
@ -567,4 +620,30 @@ public interface EntityMappingType
|
||||||
SqlAstCreationState creationState) {
|
SqlAstCreationState creationState) {
|
||||||
getEntityPersister().applyWhereRestrictions( predicateConsumer, tableGroup, useQualifier, creationState );
|
getEntityPersister().applyWhereRestrictions( predicateConsumer, tableGroup, useQualifier, creationState );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safety-net.
|
||||||
|
*/
|
||||||
|
// todo (6.0) : look to remove need for this. at the very least, move it to an SPI contract
|
||||||
|
@Internal
|
||||||
|
EntityPersister getEntityPersister();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated See {@link Contributable#getContributor()}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
default String getContributor() {
|
||||||
|
// todo (6.0) : needed for the HHH-14470 half related to HHH-14469
|
||||||
|
return "orm";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String getPartName() {
|
||||||
|
return getEntityName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String getRootPathName() {
|
||||||
|
return getEntityName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@ import org.hibernate.sql.results.graph.FetchableContainer;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface EntityValuedModelPart extends FetchableContainer {
|
public interface EntityValuedModelPart extends FetchableContainer {
|
||||||
|
/**
|
||||||
|
* The descriptor of the entity that is the type for this part
|
||||||
|
*/
|
||||||
EntityMappingType getEntityMappingType();
|
EntityMappingType getEntityMappingType();
|
||||||
|
|
||||||
default ModelPart findSubPart(String name) {
|
default ModelPart findSubPart(String name) {
|
||||||
|
|
|
@ -14,8 +14,9 @@ import org.hibernate.sql.results.graph.FetchableContainer;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commonality in regards to the mapping type system for all managed domain
|
* Mapping-model corollary to JPA's {@link jakarta.persistence.metamodel.ManagedType}
|
||||||
* types - entity types, mapped-superclass types, composite types, etc
|
*
|
||||||
|
* @see jakarta.persistence.metamodel.ManagedType
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@ -40,6 +41,11 @@ public interface ManagedMappingType extends MappingType, FetchableContainer {
|
||||||
*/
|
*/
|
||||||
AttributeMapping getAttributeMapping(int position);
|
AttributeMapping getAttributeMapping(int position);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find an attribute by name.
|
||||||
|
*
|
||||||
|
* @return The named attribute, or {@code null} if no match was found
|
||||||
|
*/
|
||||||
default AttributeMapping findAttributeMapping(String name) {
|
default AttributeMapping findAttributeMapping(String name) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -52,7 +58,7 @@ public interface ManagedMappingType extends MappingType, FetchableContainer {
|
||||||
/**
|
/**
|
||||||
* Visit attributes defined on this class and any supers
|
* Visit attributes defined on this class and any supers
|
||||||
*/
|
*/
|
||||||
void visitAttributeMappings(Consumer<? super AttributeMapping> action);
|
void forEachAttributeMapping(Consumer<? super AttributeMapping> action);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Visit attributes defined on this class and any supers
|
* Visit attributes defined on this class and any supers
|
||||||
|
@ -61,14 +67,26 @@ public interface ManagedMappingType extends MappingType, FetchableContainer {
|
||||||
getAttributeMappings().indexedForEach( consumer );
|
getAttributeMappings().indexedForEach( consumer );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the individual attribute values from the entity instance
|
||||||
|
*/
|
||||||
Object[] getValues(Object instance);
|
Object[] getValues(Object instance);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract a specific attribute value from the entity instance, by position
|
||||||
|
*/
|
||||||
default Object getValue(Object instance, int position) {
|
default Object getValue(Object instance, int position) {
|
||||||
return getAttributeMapping( position ).getValue( instance );
|
return getAttributeMapping( position ).getValue( instance );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject the attribute values into the entity instance
|
||||||
|
*/
|
||||||
void setValues(Object instance, Object[] resolvedValues);
|
void setValues(Object instance, Object[] resolvedValues);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject a specific attribute value into the entity instance, by position
|
||||||
|
*/
|
||||||
default void setValue(Object instance, int position, Object value) {
|
default void setValue(Object instance, int position, Object value) {
|
||||||
getAttributeMapping( position ).setValue( instance, value );
|
getAttributeMapping( position ).setValue( instance, value );
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,13 @@ package org.hibernate.metamodel.mapping;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parts of the ModelPart hierarchy that are type descriptors, as opposed to attributes e.g.
|
* Common descriptor for types in the mapping model - entities, embeddables, String, Integer, etc
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface MappingType {
|
public interface MappingType {
|
||||||
|
/**
|
||||||
|
* The {@linkplain JavaType descriptor} descriptor for the mapped Java type
|
||||||
|
*/
|
||||||
JavaType<?> getMappedJavaType();
|
JavaType<?> getMappedJavaType();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,9 @@ import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Describes a mapping related to any part of the app's domain model - e.g.
|
* Base descriptor, within the mapping model, for any part of the
|
||||||
* an attribute, an entity identifier, collection elements, etc
|
* application's domain model - an attribute,
|
||||||
|
* an entity identifier, collection elements, etc
|
||||||
*
|
*
|
||||||
* @see DomainResultProducer
|
* @see DomainResultProducer
|
||||||
* @see jakarta.persistence.metamodel.Bindable
|
* @see jakarta.persistence.metamodel.Bindable
|
||||||
|
@ -80,15 +81,9 @@ public interface ModelPart extends MappingModelExpressible {
|
||||||
* Whether this model part describes something that physically
|
* Whether this model part describes something that physically
|
||||||
* exists in the domain model.
|
* exists in the domain model.
|
||||||
* <p/>
|
* <p/>
|
||||||
* For example, take an entity defining its identifier with multiple
|
* For example, an entity's {@linkplain EntityDiscriminatorMapping discriminator}
|
||||||
* {@link jakarta.persistence.Id} attributes; a "non-aggregated" identifier.
|
* is part of the model, but is not a physical part of the domain model - there
|
||||||
* Internally, Hibernate models the
|
* is no "discriminator attribute".
|
||||||
* {@linkplain EntityMappingType#getIdentifierMapping() identifier mapping}
|
|
||||||
* for that entity as a virtual {@link EmbeddableMappingType}. The entity
|
|
||||||
* might also define an {@link jakarta.persistence.IdClass}, but that is a
|
|
||||||
* different mapping; in this case, the entity will have 2 mappings - one
|
|
||||||
* physical (the {@link jakarta.persistence.IdClass}) and the other virtual
|
|
||||||
* (the "non-aggregated" embeddable)
|
|
||||||
* <p/>
|
* <p/>
|
||||||
* Also indicates whether the part is castable to {@link VirtualModelPart}
|
* Also indicates whether the part is castable to {@link VirtualModelPart}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -14,7 +14,28 @@ import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
||||||
import org.hibernate.loader.ast.spi.NaturalIdLoader;
|
import org.hibernate.loader.ast.spi.NaturalIdLoader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mapping for an entity's natural-id, if one is defined
|
* Mapping for an entity's natural-id, if one is defined.
|
||||||
|
* <p/>
|
||||||
|
* Natural identifiers are an alternative form of uniquely
|
||||||
|
* identifying a specific row. In this sense, they are similar
|
||||||
|
* to a primary key. In fact most natural identifiers will also
|
||||||
|
* be classified as "candidate keys" (as in a column or group of
|
||||||
|
* columns that are considered candidates for primary-key).
|
||||||
|
* <p/>
|
||||||
|
* However, a natural id has fewer restrictions than a primary
|
||||||
|
* key. While these lessened restrictions make them inappropriate
|
||||||
|
* for use as a primary key, they are still generally usable as
|
||||||
|
* unique locators with caveats. General reasons a natural id
|
||||||
|
* might be inappropriate for use as a primary key are<ul>
|
||||||
|
* <li>it contains nullable values</li>
|
||||||
|
* <li>it contains modifiable values</li>
|
||||||
|
* </ul>
|
||||||
|
* <p/>
|
||||||
|
* See other sources for a more complete discussion of data modeling.
|
||||||
|
*
|
||||||
|
* @see org.hibernate.Session#byNaturalId
|
||||||
|
* @see org.hibernate.Session#bySimpleNaturalId
|
||||||
|
* @see org.hibernate.Session#byMultipleNaturalId
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -21,8 +21,7 @@ import org.hibernate.sql.ast.tree.predicate.Predicate;
|
||||||
*/
|
*/
|
||||||
public interface Restrictable extends FilterRestrictable, WhereRestrictable {
|
public interface Restrictable extends FilterRestrictable, WhereRestrictable {
|
||||||
/**
|
/**
|
||||||
* Applies the base set of restrictions. The impact varies based on
|
* Applies the base set of restrictions.
|
||||||
* Restrictable type - some apply restrictions for filter, where and/or discriminator
|
|
||||||
*/
|
*/
|
||||||
void applyBaseRestrictions(
|
void applyBaseRestrictions(
|
||||||
Consumer<Predicate> predicateConsumer,
|
Consumer<Predicate> predicateConsumer,
|
||||||
|
|
|
@ -49,8 +49,8 @@ import org.hibernate.metamodel.mapping.SelectablePath;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
|
||||||
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.internal.MutableAttributeMappingList;
|
import org.hibernate.persister.internal.MutableAttributeMappingList;
|
||||||
import org.hibernate.property.access.spi.PropertyAccess;
|
import org.hibernate.property.access.spi.PropertyAccess;
|
||||||
import org.hibernate.spi.NavigablePath;
|
import org.hibernate.spi.NavigablePath;
|
||||||
|
@ -655,7 +655,7 @@ public class EmbeddableMappingTypeImpl extends AbstractEmbeddableMapping impleme
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitFetchables(Consumer<? super Fetchable> consumer, EntityMappingType treatTargetType) {
|
public void visitFetchables(Consumer<? super Fetchable> consumer, EntityMappingType treatTargetType) {
|
||||||
visitAttributeMappings( consumer );
|
forEachAttributeMapping( consumer );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -880,7 +880,7 @@ public class EmbeddableMappingTypeImpl extends AbstractEmbeddableMapping impleme
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(final Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(final Consumer<? super AttributeMapping> action) {
|
||||||
attributeMappings.forEach( action );
|
attributeMappings.forEach( action );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -898,7 +898,7 @@ public class EmbeddableMappingTypeImpl extends AbstractEmbeddableMapping impleme
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitSubParts(Consumer<ModelPart> consumer, EntityMappingType treatTargetType) {
|
public void visitSubParts(Consumer<ModelPart> consumer, EntityMappingType treatTargetType) {
|
||||||
visitAttributeMappings( consumer );
|
forEachAttributeMapping( consumer );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.generator.EventType;
|
import org.hibernate.generator.EventType;
|
||||||
|
import org.hibernate.generator.Generator;
|
||||||
import org.hibernate.generator.InDatabaseGenerator;
|
import org.hibernate.generator.InDatabaseGenerator;
|
||||||
import org.hibernate.loader.ast.internal.LoaderSelectBuilder;
|
import org.hibernate.loader.ast.internal.LoaderSelectBuilder;
|
||||||
import org.hibernate.loader.ast.internal.NoCallbackExecutionContext;
|
import org.hibernate.loader.ast.internal.NoCallbackExecutionContext;
|
||||||
|
@ -30,7 +31,6 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
|
||||||
import org.hibernate.sql.exec.spi.ExecutionContext;
|
import org.hibernate.sql.exec.spi.ExecutionContext;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
|
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
|
||||||
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
|
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
|
||||||
import org.hibernate.generator.Generator;
|
|
||||||
|
|
||||||
import static org.hibernate.sql.results.spi.ListResultsConsumer.UniqueSemantic.FILTER;
|
import static org.hibernate.sql.results.spi.ListResultsConsumer.UniqueSemantic.FILTER;
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ public class GeneratedValuesProcessor {
|
||||||
// GenerationTiming.NEVER even if they have attributes that would need generation
|
// GenerationTiming.NEVER even if they have attributes that would need generation
|
||||||
final Generator[] generators = entityDescriptor.getEntityPersister().getEntityMetamodel().getGenerators();
|
final Generator[] generators = entityDescriptor.getEntityPersister().getEntityMetamodel().getGenerators();
|
||||||
final List<AttributeMapping> generatedValuesToSelect = new ArrayList<>();
|
final List<AttributeMapping> generatedValuesToSelect = new ArrayList<>();
|
||||||
entityDescriptor.visitAttributeMappings( mapping -> {
|
entityDescriptor.forEachAttributeMapping( mapping -> {
|
||||||
final Generator generator = generators[ mapping.getStateArrayPosition() ];
|
final Generator generator = generators[ mapping.getStateArrayPosition() ];
|
||||||
if ( generator != null
|
if ( generator != null
|
||||||
&& generator.generatedByDatabase()
|
&& generator.generatedByDatabase()
|
||||||
|
|
|
@ -36,8 +36,8 @@ import org.hibernate.metamodel.mapping.SelectableMappings;
|
||||||
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
|
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.internal.MutableAttributeMappingList;
|
import org.hibernate.persister.internal.MutableAttributeMappingList;
|
||||||
import org.hibernate.property.access.internal.PropertyAccessStrategyMapImpl;
|
import org.hibernate.property.access.internal.PropertyAccessStrategyMapImpl;
|
||||||
import org.hibernate.property.access.spi.PropertyAccess;
|
import org.hibernate.property.access.spi.PropertyAccess;
|
||||||
|
@ -53,8 +53,6 @@ import org.hibernate.type.CompositeType;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
import org.hibernate.type.spi.CompositeTypeImplementor;
|
import org.hibernate.type.spi.CompositeTypeImplementor;
|
||||||
|
|
||||||
import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.getAttributeMetadata;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EmbeddableMappingType implementation describing an {@link jakarta.persistence.IdClass}
|
* EmbeddableMappingType implementation describing an {@link jakarta.persistence.IdClass}
|
||||||
*/
|
*/
|
||||||
|
@ -322,7 +320,7 @@ public class IdClassEmbeddable extends AbstractEmbeddableMapping implements Iden
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
forEachAttribute( (index, attribute) -> action.accept( attribute ) );
|
forEachAttribute( (index, attribute) -> action.accept( attribute ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.hibernate.loader.ast.internal.SimpleNaturalIdLoader;
|
||||||
import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
||||||
import org.hibernate.loader.ast.spi.NaturalIdLoader;
|
import org.hibernate.loader.ast.spi.NaturalIdLoader;
|
||||||
import org.hibernate.mapping.IndexedConsumer;
|
import org.hibernate.mapping.IndexedConsumer;
|
||||||
|
import org.hibernate.metamodel.mapping.AttributeMapping;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||||
import org.hibernate.metamodel.mapping.JdbcMapping;
|
import org.hibernate.metamodel.mapping.JdbcMapping;
|
||||||
import org.hibernate.metamodel.mapping.MappingType;
|
import org.hibernate.metamodel.mapping.MappingType;
|
||||||
|
@ -57,6 +58,10 @@ public class SimpleNaturalIdMapping extends AbstractNaturalIdMapping implements
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SingularAttributeMapping getAttribute() {
|
||||||
|
return attribute;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void verifyFlushState(Object id, Object[] currentState, Object[] loadedState, SharedSessionContractImplementor session) {
|
public void verifyFlushState(Object id, Object[] currentState, Object[] loadedState, SharedSessionContractImplementor session) {
|
||||||
if ( isMutable() ) {
|
if ( isMutable() ) {
|
||||||
|
@ -165,10 +170,6 @@ public class SimpleNaturalIdMapping extends AbstractNaturalIdMapping implements
|
||||||
return getJavaType().coerce( normalizedValue, this );
|
return getJavaType().coerce( normalizedValue, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
public SingularAttributeMapping getAttribute() {
|
|
||||||
return attribute;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SingularAttributeMapping> getNaturalIdAttributes() {
|
public List<SingularAttributeMapping> getNaturalIdAttributes() {
|
||||||
return Collections.singletonList( attribute );
|
return Collections.singletonList( attribute );
|
||||||
|
@ -269,4 +270,9 @@ public class SimpleNaturalIdMapping extends AbstractNaturalIdMapping implements
|
||||||
public TypeConfiguration getTypeConfiguration() {
|
public TypeConfiguration getTypeConfiguration() {
|
||||||
return typeConfiguration;
|
return typeConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AttributeMapping asAttributeMapping() {
|
||||||
|
return getAttribute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ import org.hibernate.metamodel.mapping.SelectableMapping;
|
||||||
import org.hibernate.metamodel.mapping.SelectableMappings;
|
import org.hibernate.metamodel.mapping.SelectableMappings;
|
||||||
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
|
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.internal.MutableAttributeMappingList;
|
import org.hibernate.persister.internal.MutableAttributeMappingList;
|
||||||
import org.hibernate.spi.NavigablePath;
|
import org.hibernate.spi.NavigablePath;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||||
|
@ -241,7 +241,7 @@ public class VirtualIdEmbeddable extends AbstractEmbeddableMapping implements Id
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
forEachAttribute( (index, attribute) -> action.accept( attribute ) );
|
forEachAttribute( (index, attribute) -> action.accept( attribute ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -871,7 +871,7 @@ public abstract class AbstractEntityPersister
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDiscriminatorColumnReaderTemplate() {
|
public String getDiscriminatorColumnReaderTemplate() {
|
||||||
if ( getSubMappingTypes().size() == 1 ) {
|
if ( getSubclassEntityNames().size() == 1 ) {
|
||||||
return getDiscriminatorSQLValue();
|
return getDiscriminatorSQLValue();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -4575,7 +4575,7 @@ public abstract class AbstractEntityPersister
|
||||||
// org.hibernate.metamodel.mapping.EntityMappingType
|
// org.hibernate.metamodel.mapping.EntityMappingType
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
this.attributeMappings.forEach( action );
|
this.attributeMappings.forEach( action );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5472,7 +5472,7 @@ public abstract class AbstractEntityPersister
|
||||||
ImmutableAttributeMappingList.Builder builder = new ImmutableAttributeMappingList.Builder( sizeHint );
|
ImmutableAttributeMappingList.Builder builder = new ImmutableAttributeMappingList.Builder( sizeHint );
|
||||||
|
|
||||||
if ( superMappingType != null ) {
|
if ( superMappingType != null ) {
|
||||||
superMappingType.visitAttributeMappings( builder::add );
|
superMappingType.forEachAttributeMapping( builder::add );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( AttributeMapping am : declaredAttributeMappings.valueIterator() ) {
|
for ( AttributeMapping am : declaredAttributeMappings.valueIterator() ) {
|
||||||
|
@ -5766,7 +5766,7 @@ public abstract class AbstractEntityPersister
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitSubTypeAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void visitSubTypeAttributeMappings(Consumer<? super AttributeMapping> action) {
|
||||||
visitAttributeMappings( action );
|
forEachAttributeMapping( action );
|
||||||
if ( subclassMappingTypes != null ) {
|
if ( subclassMappingTypes != null ) {
|
||||||
for ( EntityMappingType subType : subclassMappingTypes.values() ) {
|
for ( EntityMappingType subType : subclassMappingTypes.values() ) {
|
||||||
subType.visitDeclaredAttributeMappings( action );
|
subType.visitDeclaredAttributeMappings( action );
|
||||||
|
|
|
@ -164,7 +164,7 @@ public class AnonymousTupleEmbeddableValuedModelPart implements EmbeddableValued
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import org.hibernate.Incubating;
|
import org.hibernate.Incubating;
|
||||||
|
import org.hibernate.engine.OptimisticLockStyle;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
import org.hibernate.loader.ast.spi.MultiNaturalIdLoader;
|
||||||
|
@ -42,9 +43,9 @@ import org.hibernate.metamodel.mapping.internal.SingleAttributeIdentifierMapping
|
||||||
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
|
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
|
||||||
import org.hibernate.metamodel.model.domain.DomainType;
|
import org.hibernate.metamodel.model.domain.DomainType;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsMap;
|
import org.hibernate.persister.entity.AttributeMappingsMap;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
|
||||||
import org.hibernate.query.sqm.ComparisonOperator;
|
import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.spi.NavigablePath;
|
import org.hibernate.spi.NavigablePath;
|
||||||
import org.hibernate.sql.ast.SqlAstJoinType;
|
import org.hibernate.sql.ast.SqlAstJoinType;
|
||||||
|
@ -173,8 +174,8 @@ public class AnonymousTupleEntityValuedModelPart
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
delegate.getEntityMappingType().visitAttributeMappings( action );
|
delegate.getEntityMappingType().forEachAttributeMapping( action );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -640,13 +641,13 @@ public class AnonymousTupleEntityValuedModelPart
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSubclassForDiscriminatorValue(Object value) {
|
public EntityVersionMapping getVersionMapping() {
|
||||||
return delegate.getEntityMappingType().getSubclassForDiscriminatorValue( value );
|
return delegate.getEntityMappingType().getVersionMapping();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityVersionMapping getVersionMapping() {
|
public OptimisticLockStyle optimisticLockStyle() {
|
||||||
return delegate.getEntityMappingType().getVersionMapping();
|
return delegate.getEntityMappingType().optimisticLockStyle();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,7 +15,6 @@ import org.hibernate.LockMode;
|
||||||
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
|
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
|
||||||
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
|
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||||
import org.hibernate.spi.NavigablePath;
|
|
||||||
import org.hibernate.query.named.FetchMemento;
|
import org.hibernate.query.named.FetchMemento;
|
||||||
import org.hibernate.query.named.FetchMementoBasic;
|
import org.hibernate.query.named.FetchMementoBasic;
|
||||||
import org.hibernate.query.named.ResultMementoEntity;
|
import org.hibernate.query.named.ResultMementoEntity;
|
||||||
|
@ -25,6 +24,7 @@ import org.hibernate.query.results.ResultBuilderEntityValued;
|
||||||
import org.hibernate.query.results.complete.CompleteResultBuilderEntityJpa;
|
import org.hibernate.query.results.complete.CompleteResultBuilderEntityJpa;
|
||||||
import org.hibernate.query.results.complete.DelayedFetchBuilderBasicPart;
|
import org.hibernate.query.results.complete.DelayedFetchBuilderBasicPart;
|
||||||
import org.hibernate.query.results.implicit.ImplicitFetchBuilderBasic;
|
import org.hibernate.query.results.implicit.ImplicitFetchBuilderBasic;
|
||||||
|
import org.hibernate.spi.NavigablePath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
@ -85,7 +85,7 @@ public class ResultMementoEntityJpa implements ResultMementoEntity, FetchMemento
|
||||||
|
|
||||||
final boolean isEnhancedForLazyLoading = entityDescriptor.getRepresentationStrategy().isBytecodeEnhanced();
|
final boolean isEnhancedForLazyLoading = entityDescriptor.getRepresentationStrategy().isBytecodeEnhanced();
|
||||||
// Implicit basic fetches are DELAYED by default, so register fetch builders for the remaining basic fetchables
|
// Implicit basic fetches are DELAYED by default, so register fetch builders for the remaining basic fetchables
|
||||||
entityDescriptor.visitAttributeMappings(
|
entityDescriptor.forEachAttributeMapping(
|
||||||
attributeMapping -> {
|
attributeMapping -> {
|
||||||
final Function<String, FetchBuilder> fetchBuilderCreator;
|
final Function<String, FetchBuilder> fetchBuilderCreator;
|
||||||
if ( attributeMapping instanceof BasicValuedModelPart ) {
|
if ( attributeMapping instanceof BasicValuedModelPart ) {
|
||||||
|
|
|
@ -9,7 +9,6 @@ package org.hibernate.sql.ast.tree.from;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.hibernate.metamodel.mapping.ModelPartContainer;
|
|
||||||
import org.hibernate.spi.NavigablePath;
|
import org.hibernate.spi.NavigablePath;
|
||||||
import org.hibernate.sql.ast.spi.FromClauseAccess;
|
import org.hibernate.sql.ast.spi.FromClauseAccess;
|
||||||
import org.hibernate.sql.ast.spi.SqlAliasBase;
|
import org.hibernate.sql.ast.spi.SqlAliasBase;
|
||||||
|
@ -19,12 +18,12 @@ import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
||||||
import org.hibernate.sql.ast.tree.predicate.Predicate;
|
import org.hibernate.sql.ast.tree.predicate.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contract for things that can produce the {@link TableGroup} that is the root of a
|
* Contract for things that can produce the {@link TableGroup} that is a root of a
|
||||||
* from-clause
|
* {@link FromClause#getRoots() from-clause}
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface RootTableGroupProducer extends TableGroupProducer, ModelPartContainer {
|
public interface RootTableGroupProducer extends TableGroupProducer {
|
||||||
/**
|
/**
|
||||||
* Create a root TableGroup as defined by this producer
|
* Create a root TableGroup as defined by this producer
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.sql.results.graph.entity;
|
package org.hibernate.sql.results.graph.entity;
|
||||||
|
|
||||||
import org.hibernate.engine.FetchTiming;
|
|
||||||
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
|
|
||||||
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.EntityRowIdMapping;
|
import org.hibernate.metamodel.mapping.EntityRowIdMapping;
|
||||||
|
@ -24,7 +22,6 @@ 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.Fetch;
|
||||||
import org.hibernate.sql.results.graph.FetchParent;
|
import org.hibernate.sql.results.graph.FetchParent;
|
||||||
import org.hibernate.sql.results.graph.Fetchable;
|
|
||||||
import org.hibernate.sql.results.graph.basic.BasicFetch;
|
import org.hibernate.sql.results.graph.basic.BasicFetch;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
|
@ -90,7 +87,7 @@ public abstract class AbstractEntityResultGraphNode extends AbstractFetchParent
|
||||||
TableGroup entityTableGroup) {
|
TableGroup entityTableGroup) {
|
||||||
final MappingType mappingType = identifierMapping.getPartMappingType();
|
final MappingType mappingType = identifierMapping.getPartMappingType();
|
||||||
if ( mappingType instanceof ManagedMappingType ) {
|
if ( mappingType instanceof ManagedMappingType ) {
|
||||||
( (ManagedMappingType) mappingType ).visitAttributeMappings(
|
( (ManagedMappingType) mappingType ).forEachAttributeMapping(
|
||||||
attributeMapping -> {
|
attributeMapping -> {
|
||||||
if ( attributeMapping instanceof ToOneAttributeMapping ) {
|
if ( attributeMapping instanceof ToOneAttributeMapping ) {
|
||||||
( (ToOneAttributeMapping) attributeMapping ).getForeignKeyDescriptor()
|
( (ToOneAttributeMapping) attributeMapping ).getForeignKeyDescriptor()
|
||||||
|
|
|
@ -58,9 +58,9 @@ import org.hibernate.metamodel.mapping.TableDetails;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
||||||
import org.hibernate.persister.collection.CollectionPersister;
|
import org.hibernate.persister.collection.CollectionPersister;
|
||||||
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsMap;
|
import org.hibernate.persister.entity.AttributeMappingsMap;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
|
||||||
import org.hibernate.persister.spi.PersisterClassResolver;
|
import org.hibernate.persister.spi.PersisterClassResolver;
|
||||||
import org.hibernate.persister.spi.PersisterCreationContext;
|
import org.hibernate.persister.spi.PersisterCreationContext;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
|
||||||
|
@ -722,11 +722,6 @@ public class GoofyPersisterClassProvider implements PersisterClassResolver {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubclassForDiscriminatorValue(Object value) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NaturalIdMapping getNaturalIdMapping() {
|
public NaturalIdMapping getNaturalIdMapping() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -773,7 +768,7 @@ public class GoofyPersisterClassProvider implements PersisterClassResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,9 +55,9 @@ import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
||||||
import org.hibernate.orm.test.jpa.SettingsGenerator;
|
import org.hibernate.orm.test.jpa.SettingsGenerator;
|
||||||
import org.hibernate.persister.collection.CollectionPersister;
|
import org.hibernate.persister.collection.CollectionPersister;
|
||||||
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsMap;
|
import org.hibernate.persister.entity.AttributeMappingsMap;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
|
||||||
import org.hibernate.persister.internal.PersisterClassResolverInitiator;
|
import org.hibernate.persister.internal.PersisterClassResolverInitiator;
|
||||||
import org.hibernate.persister.spi.PersisterClassResolver;
|
import org.hibernate.persister.spi.PersisterClassResolver;
|
||||||
import org.hibernate.persister.spi.PersisterCreationContext;
|
import org.hibernate.persister.spi.PersisterCreationContext;
|
||||||
|
@ -770,11 +770,6 @@ public class PersisterClassProviderTest {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubclassForDiscriminatorValue(Object value) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NaturalIdMapping getNaturalIdMapping() {
|
public NaturalIdMapping getNaturalIdMapping() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -791,7 +786,7 @@ public class PersisterClassProviderTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,9 +54,9 @@ import org.hibernate.metamodel.mapping.NaturalIdMapping;
|
||||||
import org.hibernate.metamodel.mapping.TableDetails;
|
import org.hibernate.metamodel.mapping.TableDetails;
|
||||||
import org.hibernate.metamodel.model.domain.NavigableRole;
|
import org.hibernate.metamodel.model.domain.NavigableRole;
|
||||||
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
|
||||||
|
import org.hibernate.persister.entity.AttributeMappingsList;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsMap;
|
import org.hibernate.persister.entity.AttributeMappingsMap;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.entity.AttributeMappingsList;
|
|
||||||
import org.hibernate.persister.spi.PersisterCreationContext;
|
import org.hibernate.persister.spi.PersisterCreationContext;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
||||||
|
@ -812,11 +812,6 @@ public class CustomPersister implements EntityPersister {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubclassForDiscriminatorValue(Object value) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NaturalIdMapping getNaturalIdMapping() {
|
public NaturalIdMapping getNaturalIdMapping() {
|
||||||
return null;
|
return null;
|
||||||
|
@ -863,7 +858,7 @@ public class CustomPersister implements EntityPersister {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitAttributeMappings(Consumer<? super AttributeMapping> action) {
|
public void forEachAttributeMapping(Consumer<? super AttributeMapping> action) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue