org.hibernate.persister.entity

Class JoinedSubclassEntityPersister

Implemented Interfaces:
ClassMetadata, EntityPersister, Joinable, LazyPropertyInitializer, Loadable, Lockable, OptimisticCacheSource, OuterJoinLoadable, PostInsertIdentityPersister, PropertyMapping, Queryable, SQLLoadable, UniqueKeyLoadable

public class JoinedSubclassEntityPersister
extends AbstractEntityPersister

An EntityPersister implementing the normalized "table-per-subclass" mapping strategy
Author:
Gavin King

Nested Class Summary

Nested classes/interfaces inherited from class org.hibernate.persister.entity.AbstractEntityPersister

AbstractEntityPersister.InclusionChecker

Field Summary

Fields inherited from class org.hibernate.persister.entity.AbstractEntityPersister

ENTITY_CLASS, customSQLDelete, customSQLInsert, customSQLUpdate, deleteCallable, deleteResultCheckStyles, insertCallable, insertResultCheckStyles, propertyMapping, rowIdName, updateCallable, updateResultCheckStyles

Fields inherited from interface org.hibernate.persister.entity.EntityPersister

ENTITY_ID

Fields inherited from interface org.hibernate.intercept.LazyPropertyInitializer

UNFETCHED_PROPERTY

Fields inherited from interface org.hibernate.persister.entity.Loadable

ROWID_ALIAS

Constructor Summary

JoinedSubclassEntityPersister(PersistentClass persistentClass, EntityRegionAccessStrategy cacheAccessStrategy, SessionFactoryImplementor factory, Mapping mapping)

Method Summary

void
addDiscriminatorToSelect(SelectFragment select, String name, String suffix)
String
filterFragment(String alias)
String
fromTableFragment(String alias)
Get the main from table fragment, given a query alias.
String
generateFilterConditionAlias(String rootAlias)
The alias used for any filter conditions (mapped where-fragments or enabled-filters).
String[]
getConstraintOrderedTableNameClosure()
Get the names of all tables used in the hierarchy (up and down) ordered such that deletes in the given order would not cause contraint violations.
String[][]
getContraintOrderedTableKeyColumnClosure()
For each table specified in Queryable.getConstraintOrderedTableNameClosure(), get the columns that define the key between the various hierarchy classes.
String
getDiscriminatorSQLValue()
Get the discriminator value for this particular concrete subclass, as a string that may be embedded in a select statement
Type
getDiscriminatorType()
String[]
getIdentifierColumnNames()
Get the names of columns used to persist the identifier
protected String[]
getKeyColumns(int j)
Serializable[]
getPropertySpaces()
Returns an array of objects that identify spaces in which properties of this entity are persisted, for instances of this class only.
String
getPropertyTableName(String propertyName)
Get the table name for the given property path
protected int[]
getPropertyTableNumbers()
protected int[]
getPropertyTableNumbersInSelect()
String
getRootTableAlias(String drivingAlias)
Get the SQL alias this persister would use for the root table given the passed driving alias.
String
getRootTableName()
Locks are always applied to the "root table".
protected int[]
getSubclassColumnTableNumberClosure()
String
getSubclassForDiscriminatorValue(Object value)
protected int[]
getSubclassFormulaTableNumberClosure()
Declarer
getSubclassPropertyDeclarer(String propertyPath)
Determine whether the given property is declared by our mapped class, our super class, or one of our subclasses...
String
getSubclassPropertyTableName(int i)
Return the table name used to persist the numbered property of the class or a subclass.
protected int
getSubclassPropertyTableNumber(int i)
protected String[]
getSubclassTableKeyColumns(int j)
String
getSubclassTableName(int j)
Get the name of the table with the given index from the internal array.
int
getSubclassTableSpan()
String
getTableName()
The table to join to.
protected String
getTableName(int j)
int
getTableSpan()
protected boolean
isClassOrSuperclassTable(int j)
boolean
isMultiTable()
Is the inheritence hierarchy described by this persister contained across multiple tables?
protected boolean
isPropertyOfTable(int property, int j)
protected boolean
isTableCascadeDeleteEnabled(int j)
String[]
toColumns(String alias, String propertyName)
Given a query alias and a property path, return the qualified column name

Methods inherited from class org.hibernate.persister.entity.AbstractEntityPersister

addDiscriminatorToInsert, addDiscriminatorToSelect, afterInitialize, afterReassociate, canExtractIdOutOfEntity, check, concretePropertySelectFragment, concretePropertySelectFragment, concretePropertySelectFragment, concretePropertySelectFragmentSansLeadingComma, consumesCollectionAlias, consumesEntityAlias, countSubclassProperties, createEntityLoader, createEntityLoader, createFrom, createJoin, createJoin, createProxy, createQueryLoader, createSelect, createUniqueKeyLoaders, createWhereByKey, dehydrate, dehydrate, delete, delete, filterFragment, filterFragment, findDirty, findModified, forceVersionIncrement, fromJoinFragment, generateDeleteString, generateFilterConditionAlias, generateIdentityInsertString, generateInsertGeneratedValuesSelectString, generateInsertString, generateInsertString, generateInsertString, generateLazySelectString, generateLocker, generateSelectVersionString, generateSnapshotSelectString, generateTableAlias, generateUpdateGeneratedValuesSelectString, generateUpdateString, generateUpdateString, getCacheAccessStrategy, getCacheEntryStructure, getCascadeStyle, getClassMetadata, getConcreteProxyClass, getCurrentVersion, getDatabaseSnapshot, getDiscriminatorAlias, getDiscriminatorAlias, getDiscriminatorColumnName, getDiscriminatorFormulaTemplate, getEntityMetamodel, getEntityName, getEntityType, getFactory, getFetchMode, getIdentifier, getIdentifierAliases, getIdentifierAliases, getIdentifierColumnNames, getIdentifierColumnSpan, getIdentifierGenerator, getIdentifierPropertyName, getIdentifierType, getIdentitySelectString, getKeyColumnNames, getKeyColumns, getLazyProperties, getMappedClass, getMappedSuperclass, getName, getNaturalIdentifierProperties, getNaturalIdentifierSnapshot, getNonLazyPropertyUpdateability, getPropertiesToInsert, getPropertiesToUpdate, getPropertyAliases, getPropertyCascadeStyles, getPropertyCheckability, getPropertyColumnNames, getPropertyColumnNames, getPropertyColumnSpan, getPropertyIndex, getPropertyInsertGenerationInclusions, getPropertyInsertability, getPropertyLaziness, getPropertyNames, getPropertyNullability, getPropertySpan, getPropertySubclassNames, getPropertyTableNumbers, getPropertyTableNumbersInSelect, getPropertyType, getPropertyTypes, getPropertyUpdateGenerationInclusions, getPropertyUpdateability, getPropertyUpdateability, getPropertyValue, getPropertyValue, getPropertyValues, getPropertyValuesToInsert, getPropertyVersionability, getQuerySpaces, getRootEntityName, getRootTableAlias, getRootTableIdentifierColumnNames, getRootTableKeyColumnNames, getRootTableName, getSQLDeleteStrings, getSQLIdentityInsertString, getSQLInsertStrings, getSQLLazySelectString, getSQLLazyUpdateByRowIdStrings, getSQLLazyUpdateStrings, getSQLSnapshotSelectString, getSQLUpdateByRowIdStrings, getSQLUpdateStrings, getSQLWhereString, getSelectByUniqueKeyString, getSequentialSelect, getSubclassColumnAliasClosure, getSubclassColumnClosure, getSubclassColumnLazyiness, getSubclassColumnTableNumberClosure, getSubclassEntityPersister, getSubclassFormulaAliasClosure, getSubclassFormulaClosure, getSubclassFormulaLazyiness, getSubclassFormulaTableNumberClosure, getSubclassFormulaTemplateClosure, getSubclassPropertyColumnAliases, getSubclassPropertyColumnNameClosure, getSubclassPropertyColumnNames, getSubclassPropertyColumnNames, getSubclassPropertyDeclarer, getSubclassPropertyFormulaTemplateClosure, getSubclassPropertyName, getSubclassPropertyNameClosure, getSubclassPropertySubclassNameClosure, getSubclassPropertyTableNumber, getSubclassPropertyTableNumber, getSubclassPropertyType, getSubclassPropertyTypeClosure, getSubclassTableKeyColumns, getSubclassTableName, getSubclassTableSpan, getTableName, getTableSpan, getTableUpdateNeeded, getTemporaryIdTableDDL, getTemporaryIdTableName, getTuplizer, getTuplizer, getType, getVersion, getVersionColumnName, getVersionComparator, getVersionProperty, getVersionSelectString, getVersionType, getVersionedTableName, guessEntityMode, hasCache, hasCascades, hasCollections, hasEmbeddedCompositeIdentifier, hasFormulaProperties, hasIdentifierProperty, hasInsertGeneratedProperties, hasLazyProperties, hasMutableProperties, hasNaturalIdentifier, hasProxy, hasRowId, hasSequentialSelect, hasSubclasses, hasSubselectLoadableCollections, hasUninitializedLazyProperties, hasUpdateGeneratedProperties, hasWhere, hydrate, identifierSelectFragment, implementsLifecycle, implementsValidatable, initLockers, initPropertyPaths, initSubclassPropertyAliasesMap, initializeLazyProperty, insert, insert, insert, insert, instantiate, isAbstract, isBatchLoadable, isBatchable, isCacheInvalidationRequired, isClassOrSuperclassTable, isCollection, isDefinedOnSubclass, isDeleteCallable, isExplicitPolymorphism, isIdentifierAssignedByInsert, isInherited, isInsertCallable, isInstance, isInstrumented, isInverseSubclassTable, isInverseTable, isLazyPropertiesCacheable, isMultiTable, isMutable, isNullableSubclassTable, isNullableTable, isPolymorphic, isPropertyOfTable, isSelectBeforeUpdateRequired, isSubclassEntityName, isSubclassPropertyDeferred, isSubclassPropertyNullable, isSubclassTableLazy, isSubclassTableSequentialSelect, isTableCascadeDeleteEnabled, isTransient, isUpdateCallable, isVersionPropertyGenerated, isVersionPropertyInsertable, isVersioned, load, loadByUniqueKey, lock, logStaticSQL, oneToManyFilterFragment, optimisticLockMode, postConstruct, postInstantiate, processInsertGeneratedProperties, processUpdateGeneratedProperties, propertySelectFragment, renderSelect, resetIdentifier, selectFragment, selectFragment, setIdentifier, setPropertyValue, setPropertyValue, setPropertyValues, toColumns, toColumns, toColumns, toString, toType, update, update, updateOrInsert, useDynamicInsert, useDynamicUpdate, useGetGeneratedKeys, useInsertSelectIdentity, whereJoinFragment

Constructor Details

JoinedSubclassEntityPersister

public JoinedSubclassEntityPersister(PersistentClass persistentClass,
                                     EntityRegionAccessStrategy cacheAccessStrategy,
                                     SessionFactoryImplementor factory,
                                     Mapping mapping)
            throws HibernateException

Method Details

addDiscriminatorToSelect

public void addDiscriminatorToSelect(SelectFragment select,
                                     String name,
                                     String suffix)
Overrides:
addDiscriminatorToSelect in interface AbstractEntityPersister

filterFragment

public String filterFragment(String alias)
Overrides:
filterFragment in interface AbstractEntityPersister

fromTableFragment

public String fromTableFragment(String alias)
Get the main from table fragment, given a query alias.
Specified by:
fromTableFragment in interface OuterJoinLoadable

generateFilterConditionAlias

public String generateFilterConditionAlias(String rootAlias)
The alias used for any filter conditions (mapped where-fragments or enabled-filters). This may or may not be different from the root alias depending upon the inheritence mapping strategy.
Specified by:
generateFilterConditionAlias in interface Queryable
Overrides:
generateFilterConditionAlias in interface AbstractEntityPersister
Parameters:
rootAlias - The root alias
Returns:
The alias used for "filter conditions" within the where clause.

getConstraintOrderedTableNameClosure

public String[] getConstraintOrderedTableNameClosure()
Get the names of all tables used in the hierarchy (up and down) ordered such that deletes in the given order would not cause contraint violations.
Specified by:
getConstraintOrderedTableNameClosure in interface Queryable
Returns:
The ordered array of table names.

getContraintOrderedTableKeyColumnClosure

public String[][] getContraintOrderedTableKeyColumnClosure()
For each table specified in Queryable.getConstraintOrderedTableNameClosure(), get the columns that define the key between the various hierarchy classes.

The first dimension here corresponds to the table indexes returned in Queryable.getConstraintOrderedTableNameClosure().

The second dimension should have the same length across all the elements in the first dimension. If not, that'd be a problem ;)

Specified by:
getContraintOrderedTableKeyColumnClosure in interface Queryable
Returns:

getDiscriminatorSQLValue

public String getDiscriminatorSQLValue()
Get the discriminator value for this particular concrete subclass, as a string that may be embedded in a select statement
Specified by:
getDiscriminatorSQLValue in interface Queryable

getDiscriminatorType

public Type getDiscriminatorType()
Specified by:
getDiscriminatorType in interface Loadable

getIdentifierColumnNames

public String[] getIdentifierColumnNames()
Get the names of columns used to persist the identifier
Specified by:
getIdentifierColumnNames in interface Loadable
getIdentifierColumnNames in interface Queryable
Overrides:
getIdentifierColumnNames in interface AbstractEntityPersister

getKeyColumns

protected String[] getKeyColumns(int j)
Overrides:
getKeyColumns in interface AbstractEntityPersister

getPropertySpaces

public Serializable[] getPropertySpaces()
Returns 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).

Specified by:
getPropertySpaces in interface EntityPersister
Returns:
The property spaces.

getPropertyTableName

public String getPropertyTableName(String propertyName)
Get the table name for the given property path
Specified by:
getPropertyTableName in interface OuterJoinLoadable

getPropertyTableNumbers

protected int[] getPropertyTableNumbers()
Overrides:
getPropertyTableNumbers in interface AbstractEntityPersister

getPropertyTableNumbersInSelect

protected int[] getPropertyTableNumbersInSelect()
Overrides:
getPropertyTableNumbersInSelect in interface AbstractEntityPersister

getRootTableAlias

public String getRootTableAlias(String drivingAlias)
Get the SQL alias this persister would use for the root table given the passed driving alias.
Specified by:
getRootTableAlias in interface Lockable
Overrides:
getRootTableAlias in interface AbstractEntityPersister
Parameters:
drivingAlias - The driving alias; or the alias for the table mapped by this persister in the hierarchy.
Returns:
The root table alias.

getRootTableName

public String getRootTableName()
Locks are always applied to the "root table".
Specified by:
getRootTableName in interface Lockable
Overrides:
getRootTableName in interface AbstractEntityPersister
Returns:
The root table name

getSubclassColumnTableNumberClosure

protected int[] getSubclassColumnTableNumberClosure()
Overrides:
getSubclassColumnTableNumberClosure in interface AbstractEntityPersister

getSubclassForDiscriminatorValue

public String getSubclassForDiscriminatorValue(Object value)
Specified by:
getSubclassForDiscriminatorValue in interface Loadable

getSubclassFormulaTableNumberClosure

protected int[] getSubclassFormulaTableNumberClosure()
Overrides:
getSubclassFormulaTableNumberClosure in interface AbstractEntityPersister

getSubclassPropertyDeclarer

public Declarer getSubclassPropertyDeclarer(String propertyPath)
Specified by:
getSubclassPropertyDeclarer in interface Queryable
Overrides:
getSubclassPropertyDeclarer in interface AbstractEntityPersister
Parameters:
propertyPath - The property name.
Returns:
The property declarer

getSubclassPropertyTableName

public String getSubclassPropertyTableName(int i)
Return the table name used to persist the numbered property of the class or a subclass.
Specified by:
getSubclassPropertyTableName in interface OuterJoinLoadable

getSubclassPropertyTableNumber

protected int getSubclassPropertyTableNumber(int i)
Overrides:
getSubclassPropertyTableNumber in interface AbstractEntityPersister

getSubclassTableKeyColumns

protected String[] getSubclassTableKeyColumns(int j)
Overrides:
getSubclassTableKeyColumns in interface AbstractEntityPersister

getSubclassTableName

public String getSubclassTableName(int j)
Get the name of the table with the given index from the internal array.
Specified by:
getSubclassTableName in interface Queryable
Overrides:
getSubclassTableName in interface AbstractEntityPersister
Parameters:
Returns:

getSubclassTableSpan

public int getSubclassTableSpan()
Overrides:
getSubclassTableSpan in interface AbstractEntityPersister

getTableName

public String getTableName()
The table to join to.
Specified by:
getTableName in interface Joinable

getTableName

protected String getTableName(int j)
Overrides:
getTableName in interface AbstractEntityPersister

getTableSpan

public int getTableSpan()
Overrides:
getTableSpan in interface AbstractEntityPersister

isClassOrSuperclassTable

protected boolean isClassOrSuperclassTable(int j)
Overrides:
isClassOrSuperclassTable in interface AbstractEntityPersister

isMultiTable

public boolean isMultiTable()
Is the inheritence hierarchy described by this persister contained across multiple tables?
Specified by:
isMultiTable in interface Queryable
Overrides:
isMultiTable in interface AbstractEntityPersister
Returns:
True if the inheritence hierarchy is spread across multiple tables; false otherwise.

isPropertyOfTable

protected boolean isPropertyOfTable(int property,
                                    int j)
Overrides:
isPropertyOfTable in interface AbstractEntityPersister

isTableCascadeDeleteEnabled

protected boolean isTableCascadeDeleteEnabled(int j)
Overrides:
isTableCascadeDeleteEnabled in interface AbstractEntityPersister

toColumns

public String[] toColumns(String alias,
                          String propertyName)
            throws QueryException
Given a query alias and a property path, return the qualified column name
Specified by:
toColumns in interface PropertyMapping
Overrides:
toColumns in interface AbstractEntityPersister