/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.mapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;

import org.hibernate.AssertionFailure;
import org.hibernate.EntityMode;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.engine.OptimisticLockStyle;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.collections.SingletonIterator;

A sublass in a table-per-class-hierarchy mapping
Author:Gavin King
/** * A sublass in a table-per-class-hierarchy mapping * @author Gavin King */
public class Subclass extends PersistentClass { private PersistentClass superclass; private Class classPersisterClass; private final int subclassId; public Subclass(PersistentClass superclass, MetadataBuildingContext metadataBuildingContext) { super( metadataBuildingContext ); this.superclass = superclass; this.subclassId = superclass.nextSubclassId(); } int nextSubclassId() { return getSuperclass().nextSubclassId(); } public int getSubclassId() { return subclassId; } @Override public String getNaturalIdCacheRegionName() { return getSuperclass().getNaturalIdCacheRegionName(); } public String getCacheConcurrencyStrategy() { return getRootClass().getCacheConcurrencyStrategy(); } public RootClass getRootClass() { return getSuperclass().getRootClass(); } public PersistentClass getSuperclass() { return superclass; } public Property getIdentifierProperty() { return getSuperclass().getIdentifierProperty(); } public Property getDeclaredIdentifierProperty() { return null; } public KeyValue getIdentifier() { return getSuperclass().getIdentifier(); } public boolean hasIdentifierProperty() { return getSuperclass().hasIdentifierProperty(); } public Value getDiscriminator() { return getSuperclass().getDiscriminator(); } public boolean isMutable() { return getSuperclass().isMutable(); } public boolean isInherited() { return true; } public boolean isPolymorphic() { return true; } public void addProperty(Property p) { super.addProperty(p); getSuperclass().addSubclassProperty(p); } public void addMappedsuperclassProperty(Property p) { super.addMappedsuperclassProperty( p ); getSuperclass().addSubclassProperty(p); } public void addJoin(Join j) { super.addJoin(j); getSuperclass().addSubclassJoin(j); } public Iterator getPropertyClosureIterator() { return new JoinedIterator( getSuperclass().getPropertyClosureIterator(), getPropertyIterator() ); } public Iterator getTableClosureIterator() { return new JoinedIterator( getSuperclass().getTableClosureIterator(), new SingletonIterator( getTable() ) ); } public Iterator getKeyClosureIterator() { return new JoinedIterator( getSuperclass().getKeyClosureIterator(), new SingletonIterator( getKey() ) ); } protected void addSubclassProperty(Property p) { super.addSubclassProperty(p); getSuperclass().addSubclassProperty(p); } protected void addSubclassJoin(Join j) { super.addSubclassJoin(j); getSuperclass().addSubclassJoin(j); } protected void addSubclassTable(Table table) { super.addSubclassTable(table); getSuperclass().addSubclassTable(table); } public boolean isVersioned() { return getSuperclass().isVersioned(); } public Property getVersion() { return getSuperclass().getVersion(); } public Property getDeclaredVersion() { return null; } public boolean hasEmbeddedIdentifier() { return getSuperclass().hasEmbeddedIdentifier(); } public Class getEntityPersisterClass() { if (classPersisterClass==null) { return getSuperclass().getEntityPersisterClass(); } else { return classPersisterClass; } } public Table getRootTable() { return getSuperclass().getRootTable(); } public KeyValue getKey() { return getSuperclass().getIdentifier(); } public boolean isExplicitPolymorphism() { return getSuperclass().isExplicitPolymorphism(); } public void setSuperclass(PersistentClass superclass) { this.superclass = superclass; } public String getWhere() { return getSuperclass().getWhere(); } public boolean isJoinedSubclass() { return getTable()!=getRootTable(); } public void createForeignKey() { if ( !isJoinedSubclass() ) { throw new AssertionFailure( "not a joined-subclass" ); } getKey().createForeignKeyOfEntity( getSuperclass().getEntityName() ); } public void setEntityPersisterClass(Class classPersisterClass) { this.classPersisterClass = classPersisterClass; } public int getJoinClosureSpan() { return getSuperclass().getJoinClosureSpan() + super.getJoinClosureSpan(); } public int getPropertyClosureSpan() { return getSuperclass().getPropertyClosureSpan() + super.getPropertyClosureSpan(); } public Iterator getJoinClosureIterator() { return new JoinedIterator( getSuperclass().getJoinClosureIterator(), super.getJoinClosureIterator() ); } public boolean isClassOrSuperclassJoin(Join join) { return super.isClassOrSuperclassJoin(join) || getSuperclass().isClassOrSuperclassJoin(join); } public boolean isClassOrSuperclassTable(Table table) { return super.isClassOrSuperclassTable(table) || getSuperclass().isClassOrSuperclassTable(table); } public Table getTable() { return getSuperclass().getTable(); } public boolean isForceDiscriminator() { return getSuperclass().isForceDiscriminator(); } public boolean isDiscriminatorInsertable() { return getSuperclass().isDiscriminatorInsertable(); } public java.util.Set getSynchronizedTables() { HashSet result = new HashSet(); result.addAll(synchronizedTables); result.addAll( getSuperclass().getSynchronizedTables() ); return result; } public Object accept(PersistentClassVisitor mv) { return mv.accept(this); } public java.util.List getFilters() { java.util.List filters = new ArrayList(super.getFilters()); filters.addAll(getSuperclass().getFilters()); return filters; } public boolean hasSubselectLoadableCollections() { return super.hasSubselectLoadableCollections() || getSuperclass().hasSubselectLoadableCollections(); } public String getTuplizerImplClassName(EntityMode mode) { String impl = super.getTuplizerImplClassName( mode ); if ( impl == null ) { impl = getSuperclass().getTuplizerImplClassName( mode ); } return impl; } public Map getTuplizerMap() { Map specificTuplizerDefs = super.getTuplizerMap(); Map superclassTuplizerDefs = getSuperclass().getTuplizerMap(); if ( specificTuplizerDefs == null && superclassTuplizerDefs == null ) { return null; } else { Map combined = new HashMap(); if ( superclassTuplizerDefs != null ) { combined.putAll( superclassTuplizerDefs ); } if ( specificTuplizerDefs != null ) { combined.putAll( specificTuplizerDefs ); } return java.util.Collections.unmodifiableMap( combined ); } } public Component getIdentifierMapper() { return superclass.getIdentifierMapper(); } @Override public OptimisticLockStyle getOptimisticLockStyle() { return superclass.getOptimisticLockStyle(); } }