initial work on joined inheritance

This commit is contained in:
Andrea Boriero 2019-11-02 18:22:54 +00:00
parent 5cdf6d4b2b
commit 704ba4f85f
5 changed files with 61 additions and 15 deletions

View File

@ -29,7 +29,6 @@ import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Supplier;
@ -181,8 +180,6 @@ import org.hibernate.sql.ast.spi.SqlAliasStemHelper;
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.QueryLiteral;
import org.hibernate.sql.ast.tree.from.StandardTableGroup;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.from.TableGroupBuilder;
import org.hibernate.sql.ast.tree.from.TableReference;
@ -6098,7 +6095,7 @@ public abstract class AbstractEntityPersister
private SortedMap<String, AttributeMapping> declaredAttributeMappings = new TreeMap<>();
private List<AttributeMapping> attributeMappings;
private List<Fetchable> staticFetchableList;
protected List<Fetchable> staticFetchableList;
protected ReflectionOptimizer.AccessOptimizer accessOptimizer;
@ -6118,7 +6115,6 @@ public abstract class AbstractEntityPersister
this.identifierMapping = superMappingType.getIdentifierMapping();
this.versionMapping = superMappingType.getVersionMapping();
this.discriminatorMapping = superMappingType.getDiscriminatorMapping();
this.naturalIdMapping = superMappingType.getNaturalIdMapping();
}
else {
@ -6553,7 +6549,7 @@ public abstract class AbstractEntityPersister
}
}
private List<Fetchable> getStaticFetchableList() {
protected List<Fetchable> getStaticFetchableList() {
if ( staticFetchableList == null ) {
staticFetchableList = new ArrayList<>( attributeMappings.size() );
visitAttributeMappings( attributeMapping -> staticFetchableList.add( (Fetchable) attributeMapping ) );

View File

@ -9,7 +9,6 @@ package org.hibernate.persister.entity;
import org.hibernate.AssertionFailure;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.QueryException;
import org.hibernate.boot.model.relational.Database;
import org.hibernate.cache.spi.access.EntityDataAccess;
@ -35,14 +34,15 @@ import org.hibernate.mapping.Subclass;
import org.hibernate.mapping.Table;
import org.hibernate.mapping.Value;
import org.hibernate.persister.spi.PersisterCreationContext;
import org.hibernate.query.sqm.sql.SqlExpressionResolver;
import org.hibernate.sql.CaseFragment;
import org.hibernate.sql.InFragment;
import org.hibernate.sql.Insert;
import org.hibernate.sql.SelectFragment;
import org.hibernate.sql.results.spi.Fetchable;
import org.hibernate.type.DiscriminatorType;
import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.Type;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.jboss.logging.Logger;
@ -51,6 +51,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -130,6 +131,10 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
private final boolean[] isNullableTable;
private final boolean[] isInverseTable;
// private final String tableName;
//
// private final String superClassTableName;
//INITIALIZATION:
public JoinedSubclassEntityPersister(
@ -207,6 +212,16 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
throw new MappingException( "optimistic-lock=all|dirty not supported for joined-subclass mappings [" + getEntityName() + "]" );
}
// final PersistentClass superclass = persistentClass.getSuperclass();
// if ( superclass != null ) {
// superClassTableName = determineTableName( superclass.getTable(), jdbcEnvironment );
// }
// else {
// superClassTableName = null;
// }
//
// tableName = determineTableName( persistentClass.getTable(), jdbcEnvironment );
//MULTITABLES
final int idColumnSpan = getIdentifierColumnSpan();
@ -1073,10 +1088,6 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
return constraintOrderedKeyColumnNames;
}
public String getRootTableName() {
return naturalOrderTableNames[0];
}
public String getRootTableAlias(String drivingAlias) {
return generateTableAlias( drivingAlias, getTableId( getRootTableName(), tableNames ) );
}
@ -1117,6 +1128,23 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
throw new HibernateException( "Could not locate table which owns column [" + columnName + "] referenced in order-by mapping" );
}
@Override
protected void buildDiscriminatorMapping() {
if ( hasSubclasses() ) {
super.buildDiscriminatorMapping();
}
}
@Override
protected List<Fetchable> getStaticFetchableList() {
if ( staticFetchableList == null ) {
staticFetchableList = new ArrayList<>( getAttributeMappings().size() );
visitAttributeMappings( attributeMapping -> staticFetchableList.add( (Fetchable) attributeMapping ) );
}
return staticFetchableList;
}
@Override
public FilterAliasGenerator getFilterAliasGenerator(String rootAlias) {

View File

@ -11,6 +11,7 @@ import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;

View File

@ -38,17 +38,25 @@ public abstract class AbstractColumnReferenceQualifier implements ColumnReferenc
public TableReference resolveTableReference(String tableExpression) {
assert tableExpression != null;
final TableReference tableReference = resolveTableReferenceInternal( tableExpression );
if ( tableReference == null ) {
throw new IllegalStateException( "Could not resolve binding for table `" + tableExpression + "`" );
}
return tableReference;
}
protected TableReference resolveTableReferenceInternal(String tableExpression) {
if ( getPrimaryTableReference().getTableExpression().equals( tableExpression ) ) {
return getPrimaryTableReference();
}
for ( TableReferenceJoin tableJoin : getTableReferenceJoins() ) {
if ( tableJoin.getJoinedTableReference().getTableExpression() == tableExpression ) {
if ( tableJoin.getJoinedTableReference().getTableExpression().equals( tableExpression ) ) {
return tableJoin.getJoinedTableReference();
}
}
throw new IllegalStateException( "Could not resolve binding for table `" + tableExpression + "`" );
return null;
}
}

View File

@ -57,4 +57,17 @@ public class StandardTableGroup extends AbstractTableGroup {
public List<TableReferenceJoin> getTableReferenceJoins() {
return tableJoins;
}
@Override
public TableReference resolveTableReferenceInternal(String tableExpression) {
TableReference tableReference = super.resolveTableReferenceInternal( tableExpression );
if ( tableReference == null ) {
for ( TableReferenceJoin tableJoin : tableJoins ) {
if ( tableJoin.getJoinedTableReference().getTableExpression().equals( tableExpression ) ) {
tableReference = tableJoin.getJoinedTableReference();
}
}
}
return tableReference;
}
}