in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java [1480:1546]
protected void bindSubClass(HibernatePersistentEntity sub, PersistentClass parent,
InFlightMetadataCollector mappings, String sessionFactoryBeanName) {
evaluateMapping(sub, defaultMapping);
Mapping m = getMapping(parent.getMappedClass());
Subclass subClass;
boolean tablePerSubclass = m != null && !m.getTablePerHierarchy() && !m.isTablePerConcreteClass();
boolean tablePerConcreteClass = m != null && m.isTablePerConcreteClass();
final String fullName = sub.getName();
if (tablePerSubclass) {
subClass = new JoinedSubclass( parent, this.metadataBuildingContext);
}
else if(tablePerConcreteClass) {
subClass = new UnionSubclass(parent, this.metadataBuildingContext);
}
else {
subClass = new SingleTableSubclass(parent, this.metadataBuildingContext);
// set the descriminator value as the name of the class. This is the
// value used by Hibernate to decide what the type of the class is
// to perform polymorphic queries
Mapping subMapping = getMapping(sub);
DiscriminatorConfig discriminatorConfig = subMapping != null ? subMapping.getDiscriminator() : null;
subClass.setDiscriminatorValue(discriminatorConfig != null && discriminatorConfig.getValue() != null ? discriminatorConfig.getValue() : fullName);
if (subMapping != null) {
configureDerivedProperties(sub, subMapping);
}
}
Integer bs = m.getBatchSize();
if (bs != null) {
subClass.setBatchSize(bs);
}
if (m.getDynamicUpdate()) {
subClass.setDynamicUpdate(true);
}
if (m.getDynamicInsert()) {
subClass.setDynamicInsert(true);
}
subClass.setCached(parent.isCached());
subClass.setAbstract(sub.isAbstract());
subClass.setEntityName(fullName);
subClass.setJpaEntityName(unqualify(fullName));
parent.addSubclass(subClass);
mappings.addEntityBinding(subClass);
if (tablePerSubclass) {
bindJoinedSubClass(sub, (JoinedSubclass) subClass, mappings, m, sessionFactoryBeanName);
}
else if( tablePerConcreteClass) {
bindUnionSubclass(sub, (UnionSubclass) subClass, mappings, sessionFactoryBeanName);
}
else {
bindSubClass(sub, subClass, mappings, sessionFactoryBeanName);
}
addMultiTenantFilterIfNecessary(sub, subClass, mappings, sessionFactoryBeanName);
final java.util.Collection<PersistentEntity> childEntities = sub.getMappingContext().getDirectChildEntities(sub);
if (!childEntities.isEmpty()) {
// bind the sub classes
bindSubClasses(sub, subClass, mappings, sessionFactoryBeanName);
}
}