Class UnionSubclassEntityPersister
- All Implemented Interfaces:
LazyPropertyInitializer,FetchProfileAffectee,Loadable,Bindable,Discriminable,EntityMappingType,EntityValuedModelPart,FilterRestrictable,InFlightEntityMappingType,JdbcMappingContainer,ManagedMappingType,MappingModelExpressible,MappingType,ModelPart,ModelPartContainer,Restrictable,SoftDeletableModelPart,WhereRestrictable,EntityPersister,Joinable,EntityMutationTarget,AttributeSource,RootTableGroupProducer,TableGroupProducer,MutationTarget<EntityTableMapping>,FetchableContainer
EntityPersister implementing the
InheritanceType.TABLE_PER_CLASS
mapping strategy for an entity and its inheritance hierarchy.
This is implemented as a separate table for each concrete class, with all inherited attributes persisted as columns of that table.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.hibernate.persister.entity.AbstractEntityPersister
AbstractEntityPersister.CacheEntryHelper, AbstractEntityPersister.MutabilityOrderedTableConsumerNested classes/interfaces inherited from interface org.hibernate.metamodel.mapping.Bindable
Bindable.JdbcValuesBiConsumer<X,Y>, Bindable.JdbcValuesConsumer Nested classes/interfaces inherited from interface org.hibernate.metamodel.mapping.EntityMappingType
EntityMappingType.ConstraintOrderedTableConsumerNested classes/interfaces inherited from interface org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer
LazyPropertyInitializer.InterceptorImplementorNested classes/interfaces inherited from interface org.hibernate.metamodel.mapping.ModelPart
ModelPart.JdbcValueBiConsumer<X,Y>, ModelPart.JdbcValueConsumer -
Field Summary
Fields inherited from class org.hibernate.persister.entity.AbstractEntityPersister
accessOptimizer, batchSize, customSQLDelete, customSQLInsert, customSQLUpdate, declaredAttributeMappings, deleteCallable, deleteExpectations, ENTITY_CLASS, fullDiscriminatorSQLValues, insertCallable, insertExpectations, insertGeneratedProperties, ROWID_ALIAS, rowIdName, staticFetchableList, updateCallable, updateExpectations, updateGeneratedProperties, VERSION_COLUMN_ALIASFields inherited from interface org.hibernate.persister.entity.EntityPersister
ENTITY_IDFields inherited from interface org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer
UNFETCHED_PROPERTY -
Constructor Summary
ConstructorsConstructorDescriptionUnionSubclassEntityPersister(PersistentClass persistentClass, EntityDataAccess cacheAccessStrategy, NaturalIdDataAccess naturalIdRegionAccessStrategy, RuntimeModelCreationContext creationContext) -
Method Summary
Modifier and TypeMethodDescriptionbooleancontainsTableReference(String tableExpression) createPrimaryTableReference(SqlAliasBase sqlAliasBase, SqlAstCreationState creationState) createRootTableGroup(boolean canUseInnerJoins, NavigablePath navigablePath, String explicitSourceAlias, SqlAliasBase sqlAliasBase, Supplier<Consumer<Predicate>> additionalPredicateCollectorAccess, SqlAstCreationState creationState) Create a root TableGroup as defined by this producerprotected EntityDiscriminatorMappinggenerateDiscriminatorMapping(PersistentClass bootEntityDescriptor) protected StringgenerateSubquery(Map<String, EntityNameUse> entityNameUses) protected StringgenerateSubquery(PersistentClass model, Metadata mapping) The name of the table to use when performing mutations (INSERT,UPDATE,DELETE) for the given attributeString[][]String[]BasicType<?> Get the discriminator typeThe discriminator value which indicates this entity mappinggetFilterAliasGenerator(String rootAlias) Details for the table that defines the identifier column(s) for an entity hierarchy.String[]getKeyColumns(int j) Details for the table this entity maps.String[]Returns an array of objects that identify spaces in which properties of this entity are persisted, for instances of this class only.protected int[]Returns an array of objects that identify spaces in which properties of this entity are persisted, for instances of this class and its subclasses.Locks are always applied to the "root table".protected String[]getSubclassTableKeyColumns(int j) getSubclassTableName(int j) protected String[]intThe table to join to.getTableName(int j) intbooleanbooleanprotected booleanisClassOrSuperclassTable(int j) protected booleanisIdentifierTable(String tableExpression) protected booleanbooleanisPropertyOfTable(int property, int j) booleanisTableCascadeDeleteEnabled(int j) booleanphysicalTableNameForMutation(SelectableMapping selectableMapping) Unfortunately we cannot directly use `SelectableMapping#getContainingTableExpression()` as that blows up for attributes declared on super-type for union-subclass mappingsvoidpruneForSubclasses(TableGroup tableGroup, Map<String, EntityNameUse> entityNameUses) Adapts the table group and its table reference as well as table reference joins in a way such that unnecessary tables or joins are omitted if possible, based on the given treated entity names.protected booleanprotected voidvoidprotected voidVisit details about each table for this entity, using "mutability ordering".Methods inherited from class org.hibernate.persister.entity.AbstractEntityPersister
addDiscriminatorToInsertGroup, addSoftDeleteToInsertGroup, afterInitialize, afterReassociate, applyBaseRestrictions, applyDiscriminator, applyFilterRestrictions, applySqlSelections, applySqlSelections, applyWhereRestrictions, buildCacheEntry, buildCacheEntryHelper, buildDeleteCoordinator, buildEmbeddedAttributeMapping, buildInsertCoordinator, buildMergeCoordinator, buildMultiIdLoader, buildPluralAttributeMapping, buildSingleIdEntityLoader, buildSingularAssociationAttributeMapping, buildTableMappings, buildUpdateCoordinator, canReadFromCache, canUseReferenceCacheEntries, canWriteToCache, countSubclassProperties, createDomainResult, createGeneratedValuesProcessor, createInsertDelegate, createProxy, createTableReferenceJoin, createUpdateDelegate, determineLoaderToUse, determineTableName, determineTableNumberForColumn, disassemble, findAttributeMapping, findDeclaredAttributeMapping, findDirty, findModified, findSubPart, findSubTypesSubPart, forceVersionIncrement, forceVersionIncrement, forEachAttributeMapping, forEachAttributeMapping, forEachDisassembledJdbcValue, forEachJdbcType, forEachJdbcValue, forEachMutableTable, forEachMutableTableReverse, forEachSelectable, generateIdentifierMapping, generateJoinPredicate, generateLocker, generateNaturalIdMapping, generateNonEncapsulatedCompositeIdentifierMapping, generateNonIdAttributeMapping, generateSelectVersionString, generateTableAlias, generateTableReferenceJoin, generateVersionMapping, generateVersionMapping, getAttributeMapping, getAttributeMappings, getBatchSize, getBytecodeEnhancementMetadata, getCacheAccessStrategy, getCacheEntryStructure, getCollectionKey, getConcreteProxyClass, getCurrentVersion, getDatabaseSnapshot, getDeclaredAttributeMappings, getDeleteCoordinator, getDiscriminatorAlias, getDiscriminatorAlias, getDiscriminatorColumnName, getDiscriminatorColumnReaders, getDiscriminatorColumnReaderTemplate, getDiscriminatorDomainType, getDiscriminatorFormulaTemplate, getDiscriminatorMapping, getEntityEntryFactory, getEntityMetamodel, getEntityName, getEntityNameByTableNameMap, getEntityPersister, getFactory, getFetchable, getFetchMode, getGenerator, getIdByUniqueKey, getIdentifier, getIdentifier, getIdentifierAliases, getIdentifierAliases, getIdentifierColumnNames, getIdentifierColumnReaders, getIdentifierColumnReaderTemplates, getIdentifierColumnSpan, getIdentifierDescriptor, getIdentifierGenerator, getIdentifierMapping, getIdentifierPropertyName, getIdentifierTableMapping, getIdentifierTableName, getIdentifierType, getIdentitySelectString, getInsertCoordinator, getInsertDelegate, getInsertGeneratedProperties, getInsertGeneratedValuesProcessor, getInstrumentationMetadata, getJdbcMapping, getJdbcTypeCount, getJpaEntityName, getKeyFetchable, getLazyLoadPlanByFetchGroup, getMappedClass, getMappedJavaType, getMappedSuperclass, getMergeCoordinator, getMultiNaturalIdLoader, getNaturalIdCacheAccessStrategy, getNaturalIdentifierProperties, getNaturalIdentifierSnapshot, getNaturalIdLoader, getNaturalIdMapping, getNavigableRole, getNonLazyPropertyUpdateability, getNumberOfAttributeMappings, getNumberOfDeclaredAttributeMappings, getNumberOfFetchableKeys, getNumberOfFetchables, getPartName, getPropertyAliases, getPropertyCascadeStyles, getPropertyCheckability, getPropertyColumnNames, getPropertyColumnNames, getPropertyIndex, getPropertyInsertability, getPropertyLaziness, getPropertyNames, getPropertyNullability, getPropertySpan, getPropertyType, getPropertyTypes, getPropertyUpdateability, getPropertyUpdateability, getPropertyValue, getPropertyValue, getPropertyValues, getPropertyValuesToInsert, getPropertyVersionability, getPrunedDiscriminatorPredicate, getRepresentationStrategy, getRootEntityName, getRootTableIdentifierColumnNames, getRootTableKeyColumnNames, getRowIdMapping, getSelectByUniqueKeyString, getSelectByUniqueKeyString, getSelectByUniqueKeyString, getSingleIdLoader, getSoftDeleteMapping, getSqlAliasStem, getSqlWhereStringTableExpression, getSqmMultiTableInsertStrategy, getSqmMultiTableMutationStrategy, getStateArrayInitialPosition, getStaticFetchableList, getSubclassColumnAliasClosure, getSubclassEntityPersister, getSubclassFormulaAliasClosure, getSubclassPropertyColumnAliases, getSubclassPropertyColumnNameClosure, getSubclassPropertyColumnNames, getSubclassPropertyColumnReaderClosure, getSubclassPropertyColumnReaderTemplateClosure, getSubclassPropertyFormulaTemplateClosure, getSubclassPropertyNameClosure, getSubclassPropertyType, getSubclassPropertyTypeClosure, getSubMappingTypes, getSuperMappingType, getTableId, getTableMapping, getTableMappings, getTableNameForColumn, getTableNames, getTargetPart, getUniqueKeyLoader, getUpdateCoordinator, getUpdateDelegate, getUpdateGeneratedProperties, getUpdateGeneratedValuesProcessor, getVersion, getVersionColumnName, getVersionedTableName, getVersionGenerator, getVersionMapping, getVersionProperty, getVersionSelectString, getVersionType, hasCache, hasCascadeDelete, hasCascadePersist, hasCascades, hasCollectionNotReferencingPK, hasCollections, hasFilterForLoadByKey, hasFormulaProperties, hasIdentifierProperty, hasInsertGeneratedProperties, hasLazyProperties, hasMutableProperties, hasNaturalIdCache, hasNaturalIdentifier, hasOwnedCollections, hasPartitionedSelectionMapping, hasProxy, hasRowId, hasSubclasses, hasSubselectLoadableCollections, hasToOnes, hasUninitializedLazyProperties, hasUpdateGeneratedProperties, hasWhereRestrictions, initializeEnhancedEntityUsedAsProxy, initializeLazyPropertiesFromCache, initializeLazyPropertiesFromDatastore, initializeLazyProperty, initializeLazyProperty, initializeLazyProperty, initializeLazyProperty, initInsertGeneratedProperties, initPropertyPaths, initSubclassPropertyAliasesMap, initUpdateGeneratedProperties, instantiate, interpretSqmMultiTableInsertStrategy, interpretSqmMultiTableStrategy, isAbstract, isAffectedByEnabledFetchProfiles, isAffectedByEnabledFilters, isAffectedByEntityGraph, isCacheInvalidationRequired, isClassOrSuperclassJoin, isConcreteProxy, isDiscriminatorFormula, isExplicitPolymorphism, isIdentifierAssignedByInsert, isInherited, isInstance, isInstrumented, isInverseTable, isLazyPropertiesCacheable, isMutable, isNonLazyPropertyName, isNullableSubclassTable, isNullableTable, isPropertySelectable, isSelectBeforeUpdateRequired, isSharedColumn, isSubclassEntityName, isSubclassTableIndicatedByTreatAsDeclarations, isTransient, isTypeOrSuperType, isVersioned, isVersionGeneratedBeforeExecution, isVersionGeneratedOnExecution, isVersionPropertyGenerated, linkToSession, linkWithSubType, linkWithSuperType, load, load, load, loadByUniqueKey, loadByUniqueKey, loadEntityIdByNaturalId, lock, lock, lock, lock, logStaticSQL, managesColumns, multiLoad, multiLoad, optimisticLockStyle, postConstruct, postInstantiate, prepareLoaders, prepareMappingModel, processInsertGeneratedProperties, processUpdateGeneratedProperties, registerAffectingFetchProfile, resetIdentifier, resolveAttributeIndexes, resolveConcreteProxyTypeForId, resolveDirtyAttributeIndexes, selectFragment, setIdentifier, setPropertyValue, setPropertyValues, shouldGetAllProperties, shouldInnerJoinSubclassTable, storeDiscriminatorInShallowQueryCacheLayout, substituteBrackets, toColumns, toString, uniqueKeyEntries, useShallowQueryCacheLayout, verifyHasNaturalId, visitAttributeMappings, visitDeclaredAttributeMappings, visitFetchables, visitFetchables, visitKeyFetchables, visitKeyFetchables, visitSubParts, visitSubTypeAttributeMappings, visitSuperTypeAttributeMappingsMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.hibernate.metamodel.mapping.Bindable
forEachDisassembledJdbcValue, forEachDisassembledJdbcValue, forEachDisassembledJdbcValue, forEachJdbcType, forEachJdbcValue, forEachJdbcValue, forEachJdbcValueMethods inherited from interface org.hibernate.metamodel.mapping.EntityMappingType
asEntityMappingType, extractConcreteTypeStateValues, findContainingEntityMapping, findSubPart, getContributor, getIdentifierMappingForJoin, getJavaType, getPartMappingType, getRootEntityDescriptor, getRootPathName, getSoftDeleteTableDetails, getSubclassEntityNames, getSubclassId, isTypeOrSuperTypeMethods inherited from interface org.hibernate.persister.entity.mutation.EntityMutationTarget
getIdentityInsertDelegate, getMutationDelegateMethods inherited from interface org.hibernate.persister.entity.EntityPersister
addToCacheKey, breakDownJdbcValues, canExtractIdOutOfEntity, delete, getEntityMappingType, getFilterAliasGenerator, getGeneratedProperties, getIdentifier, getImportedName, getSynchronizationSpaces, getSynchronizedQuerySpaces, getTypeDiscriminatorMetadata, getValue, getValues, getVersionJavaType, insert, insert, isBatchLoadable, load, merge, processInsertGeneratedProperties, processUpdateGeneratedProperties, setValue, setValues, update, visitQuerySpacesMethods inherited from interface org.hibernate.metamodel.mapping.EntityValuedModelPart
forEachSubPartMethods inherited from interface org.hibernate.sql.results.graph.FetchableContainer
getNumberOfKeyFetchables, getSelectableIndex, visitFetchables, visitKeyFetchablesMethods inherited from interface org.hibernate.metamodel.mapping.FilterRestrictable
applyFilterRestrictionsMethods inherited from interface org.hibernate.metamodel.mapping.JdbcMappingContainer
getSingleJdbcMappingMethods inherited from interface org.hibernate.loader.ast.spi.Loadable
isAffectedByEnabledFilters, isAffectedByInfluencers, isAffectedByInfluencers, isNotAffectedByInfluencersMethods inherited from interface org.hibernate.metamodel.mapping.ManagedMappingType
anyRequiresAggregateColumnWriter, isAffectedByEnabledFiltersMethods inherited from interface org.hibernate.metamodel.mapping.ModelPart
areEqual, asAttributeMapping, asBasicValuedModelPart, breakDownJdbcValues, decompose, decompose, forEachSelectable, isEntityIdentifierMapping, isVirtualMethods inherited from interface org.hibernate.metamodel.mapping.ModelPartContainer
findByPath, findByPath, forEachSubPartMethods inherited from interface org.hibernate.sql.model.MutationTarget
getRolePathMethods inherited from interface org.hibernate.metamodel.mapping.Restrictable
applyBaseRestrictions
-
Constructor Details
-
UnionSubclassEntityPersister
public UnionSubclassEntityPersister(PersistentClass persistentClass, EntityDataAccess cacheAccessStrategy, NaturalIdDataAccess naturalIdRegionAccessStrategy, RuntimeModelCreationContext creationContext) throws HibernateException - Throws:
HibernateException
-
-
Method Details
-
validateGenerator
protected void validateGenerator() -
containsTableReference
- Specified by:
containsTableReferencein interfaceTableGroupProducer- Overrides:
containsTableReferencein classAbstractEntityPersister
-
createPrimaryTableReference
public UnionTableReference createPrimaryTableReference(SqlAliasBase sqlAliasBase, SqlAstCreationState creationState) - Specified by:
createPrimaryTableReferencein interfaceEntityMappingType- Overrides:
createPrimaryTableReferencein classAbstractEntityPersister
-
needsDiscriminator
public boolean needsDiscriminator()- Specified by:
needsDiscriminatorin classAbstractEntityPersister
-
getQuerySpaces
Description copied from interface:EntityPersisterReturns an array of objects that identify spaces in which properties of this entity are persisted, for instances of this class and its subclasses.Much like
EntityPersister.getPropertySpaces(), except that here we include subclass entity spaces.- Specified by:
getQuerySpacesin interfaceEntityPersister- Overrides:
getQuerySpacesin classAbstractEntityPersister- Returns:
- The query spaces.
-
getRootTableName
Description copied from interface:EntityPersisterLocks are always applied to the "root table".- Specified by:
getRootTableNamein interfaceEntityPersister- Overrides:
getRootTableNamein classAbstractEntityPersister- Returns:
- The root table name
-
getTableName
Description copied from interface:EntityPersisterThe table to join to. -
getDiscriminatorType
Description copied from interface:EntityPersisterGet the discriminator type- Specified by:
getDiscriminatorTypein interfaceEntityPersister- Specified by:
getDiscriminatorTypein classAbstractEntityPersister
-
getSubclassByDiscriminatorValue
- Specified by:
getSubclassByDiscriminatorValuein classAbstractEntityPersister
-
getMappedTableDetails
Description copied from interface:EntityMappingTypeDetails for the table this entity maps. Generally this is the same asEntityMappingType.getIdentifierTableDetails(), though may be different for subtypes in joined andunion inheritance hierarchies- See Also:
-
getIdentifierTableDetails
Description copied from interface:EntityMappingTypeDetails for the table that defines the identifier column(s) for an entity hierarchy. -
getDiscriminatorValue
Description copied from interface:EntityMappingTypeThe discriminator value which indicates this entity mapping -
getDiscriminatorSQLValue
-
getPropertySpaces
Description copied from interface:EntityPersisterReturns an array of objects that identify spaces in which properties of this entity are persisted, for instances of this class only.For most implementations, this returns the complete set of table names to which instances of the mapped entity are persisted (not accounting for superclass entity mappings).
- Returns:
- The property spaces.
-
shouldProcessSuperMapping
protected boolean shouldProcessSuperMapping()- Overrides:
shouldProcessSuperMappingin classAbstractEntityPersister
-
hasDuplicateTables
public boolean hasDuplicateTables() -
getTableName
-
getKeyColumns
-
isTableCascadeDeleteEnabled
public boolean isTableCascadeDeleteEnabled(int j) - Specified by:
isTableCascadeDeleteEnabledin classAbstractEntityPersister
-
isPropertyOfTable
public boolean isPropertyOfTable(int property, int j) - Specified by:
isPropertyOfTablein classAbstractEntityPersister
-
getAttributeMutationTableName
Description copied from interface:EntityMutationTargetThe name of the table to use when performing mutations (INSERT,UPDATE,DELETE) for the given attribute -
physicalTableNameForMutation
Description copied from class:AbstractEntityPersisterUnfortunately we cannot directly use `SelectableMapping#getContainingTableExpression()` as that blows up for attributes declared on super-type for union-subclass mappings- Specified by:
physicalTableNameForMutationin interfaceEntityMutationTarget- Overrides:
physicalTableNameForMutationin classAbstractEntityPersister
-
isIdentifierTable
- Specified by:
isIdentifierTablein classAbstractEntityPersister
-
hasMultipleTables
public boolean hasMultipleTables()- Specified by:
hasMultipleTablesin interfaceEntityPersister- Overrides:
hasMultipleTablesin classAbstractEntityPersister
-
pruneForSubclasses
Description copied from interface:EntityMappingTypeAdapts the table group and its table reference as well as table reference joins in a way such that unnecessary tables or joins are omitted if possible, based on the given treated entity names.The goal is to e.g. remove join inheritance "branches" or union selects that are impossible.
Consider the following example:
class BaseEntity {} class Sub1 extends BaseEntity {} class Sub1Sub1 extends Sub1 {} class Sub1Sub2 extends Sub1 {} class Sub2 extends BaseEntity {} class Sub2Sub1 extends Sub2 {} class Sub2Sub2 extends Sub2 {}If the
treatedEntityNamesonly containsSub1or any of its subtypes, this means thatSub2and all subtypes are impossible, thus the joins/selects for these types shall be omitted in the given table group.- Parameters:
tableGroup- The table group to prune subclass tables forentityNameUses- The entity names under which a table group was used.
-
visitConstraintOrderedTables
-
visitMutabilityOrderedTables
protected void visitMutabilityOrderedTables(AbstractEntityPersister.MutabilityOrderedTableConsumer consumer) Description copied from class:AbstractEntityPersisterVisit details about each table for this entity, using "mutability ordering". When inserting rows, the order we go through the tables to avoid foreign key problems among the entity's group of tables.Used while building the table mapping descriptors for each table.
- Specified by:
visitMutabilityOrderedTablesin classAbstractEntityPersister- See Also:
-
isPhysicalDiscriminator
protected boolean isPhysicalDiscriminator()- Overrides:
isPhysicalDiscriminatorin classAbstractEntityPersister
-
generateDiscriminatorMapping
protected EntityDiscriminatorMapping generateDiscriminatorMapping(PersistentClass bootEntityDescriptor) - Overrides:
generateDiscriminatorMappingin classAbstractEntityPersister
-
getTableSpan
public int getTableSpan() -
getPropertyTableNumbers
protected int[] getPropertyTableNumbers()- Specified by:
getPropertyTableNumbersin classAbstractEntityPersister
-
generateSubquery
-
generateSubquery
-
getSubclassTableKeyColumns
- Specified by:
getSubclassTableKeyColumnsin classAbstractEntityPersister
-
getSubclassTableName
-
getSubclassTableNames
- Specified by:
getSubclassTableNamesin classAbstractEntityPersister
-
getSubclassTableSpan
public int getSubclassTableSpan() -
isClassOrSuperclassTable
protected boolean isClassOrSuperclassTable(int j) - Specified by:
isClassOrSuperclassTablein classAbstractEntityPersister
-
getConstraintOrderedTableNameClosure
- Specified by:
getConstraintOrderedTableNameClosurein classAbstractEntityPersister
-
getConstraintOrderedTableKeyColumnClosure
-
getFilterAliasGenerator
-