Skip to content

Commit

Permalink
HHH-7380 - union subclass support
Browse files Browse the repository at this point in the history
  • Loading branch information
stliu committed Nov 28, 2012
1 parent 73f9df1 commit 9b3e6a3
Show file tree
Hide file tree
Showing 16 changed files with 316 additions and 52 deletions.
Expand Up @@ -88,7 +88,7 @@ public DefaultIdentifierGeneratorFactory() {
register( "enhanced-sequence", SequenceStyleGenerator.class );
register( "enhanced-table", TableGenerator.class );
}

@Override
public void register(String strategy, Class generatorClass) {
LOG.debugf( "Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName() );
final Class previous = generatorStrategyToClassNameMap.put( strategy, generatorClass );
Expand Down
Expand Up @@ -37,6 +37,7 @@ public final class StringHelper {

private static final int ALIAS_TRUNCATE_LENGTH = 10;
public static final String WHITESPACE = " \n\r\f\t";
public static final String [] EMPTY_STRINGS = new String[0];

private StringHelper() { /* static methods only - hide constructor */
}
Expand Down
Expand Up @@ -347,6 +347,14 @@ public static boolean isEquals(Object[] o1, Object[] o2) {
return true;
}

public static boolean isEmpty(final Object[] arrays) {
return arrays == null || arrays.length == 0;
}

public static boolean isNotEmpty(final Object[] arrays) {
return !isEmpty( arrays );
}

/**
* Compare 2 arrays only at the first level
*/
Expand Down
Expand Up @@ -854,15 +854,17 @@ private void bindSubEntityPrimaryKey(final EntityBinding entityBinding, final En
final boolean hasPrimaryKeyJoinColumns = CollectionHelper.isNotEmpty( primaryKeyJoinColumnSources );
final List<Column> superEntityBindingPrimaryKeyColumns = superEntityBinding.getPrimaryTable().getPrimaryKey().getColumns();

for ( int i = 0; i < superEntityBindingPrimaryKeyColumns.size(); i++ ) {
for ( int i = 0, size = superEntityBindingPrimaryKeyColumns.size(); i < size; i++ ) {
Column superEntityBindingPrimaryKeyColumn = superEntityBindingPrimaryKeyColumns.get( i );
PrimaryKeyJoinColumnSource primaryKeyJoinColumnSource = hasPrimaryKeyJoinColumns && i < primaryKeyJoinColumnSources
.size() ? primaryKeyJoinColumnSources.get( i ) : null;
final String columnName;
if ( primaryKeyJoinColumnSource != null && StringHelper.isNotEmpty( primaryKeyJoinColumnSource.getColumnName() ) ) {
columnName = bindingContext().getNamingStrategy().columnName( primaryKeyJoinColumnSource.getColumnName() );
} else {
columnName = superEntityBindingPrimaryKeyColumn.getColumnName().getText();
columnName = bindingContext().getNamingStrategy()
.columnName( primaryKeyJoinColumnSource.getColumnName() );
}
else {
columnName = superEntityBindingPrimaryKeyColumn.getColumnName().getText();
}
Column column = entityBinding.getPrimaryTable().locateOrCreateColumn( columnName );
column.setCheckCondition( superEntityBindingPrimaryKeyColumn.getCheckCondition() );
Expand All @@ -873,12 +875,10 @@ private void bindSubEntityPrimaryKey(final EntityBinding entityBinding, final En
column.setReadFragment( superEntityBindingPrimaryKeyColumn.getReadFragment() );
column.setWriteFragment( superEntityBindingPrimaryKeyColumn.getWriteFragment() );
column.setUnique( superEntityBindingPrimaryKeyColumn.isUnique() );
final String sqlType;
if(primaryKeyJoinColumnSource!=null && StringHelper.isNotEmpty( primaryKeyJoinColumnSource.getColumnDefinition() )){
sqlType = primaryKeyJoinColumnSource.getColumnDefinition();
} else {
sqlType = superEntityBindingPrimaryKeyColumn.getSqlType();
}
final String sqlType = getSqlTypeFromPrimaryKeyJoinColumnSourceIfExist(
superEntityBindingPrimaryKeyColumn,
primaryKeyJoinColumnSource
);
column.setSqlType( sqlType );
column.setSize( superEntityBindingPrimaryKeyColumn.getSize() );
column.setJdbcDataType( superEntityBindingPrimaryKeyColumn.getJdbcDataType() );
Expand All @@ -889,6 +889,14 @@ private void bindSubEntityPrimaryKey(final EntityBinding entityBinding, final En
}
}

private String getSqlTypeFromPrimaryKeyJoinColumnSourceIfExist(Column superEntityBindingPrimaryKeyColumn, PrimaryKeyJoinColumnSource primaryKeyJoinColumnSource) {
final boolean isColumnDefOverrided = primaryKeyJoinColumnSource != null && StringHelper.isNotEmpty(
primaryKeyJoinColumnSource.getColumnDefinition()
);
return isColumnDefOverrided ? primaryKeyJoinColumnSource.getColumnDefinition() : superEntityBindingPrimaryKeyColumn
.getSqlType();
}

/**
* Binding a single entity hierarchy.
*
Expand Down
Expand Up @@ -195,7 +195,7 @@ public CustomSQL getCustomSqlDelete() {
}

@Override
public List<String> getSynchronizedTableNames() {
public String[] getSynchronizedTableNames() {
return entityClass.getSynchronizedTableNames();
}

Expand Down
Expand Up @@ -81,7 +81,7 @@ public class EntityClass extends ConfiguredClass {

private final String explicitEntityName;
private final String customLoaderQueryName;
private final List<String> synchronizedTableNames;
private final String[] synchronizedTableNames;
private final int batchSize;

private boolean isImmutable;
Expand Down Expand Up @@ -215,7 +215,7 @@ public CustomSQL getCustomDelete() {
return customDelete;
}

public List<String> getSynchronizedTableNames() {
public String[] getSynchronizedTableNames() {
return synchronizedTableNames;
}

Expand Down Expand Up @@ -495,16 +495,15 @@ private String determineCustomLoader() {
return customLoader;
}

private List<String> determineSynchronizedTableNames() {
private String[] determineSynchronizedTableNames() {
final AnnotationInstance synchronizeAnnotation = JandexHelper.getSingleAnnotation(
getClassInfo(), HibernateDotNames.SYNCHRONIZE
);
if ( synchronizeAnnotation != null ) {
final String[] tableNames = synchronizeAnnotation.value().asStringArray();
return Arrays.asList( tableNames );
return synchronizeAnnotation.value().asStringArray();
}
else {
return Collections.emptyList();
return StringHelper.EMPTY_STRINGS;
}
}

Expand Down
Expand Up @@ -31,6 +31,7 @@

import org.hibernate.EntityMode;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.jaxb.spi.Origin;
import org.hibernate.jaxb.spi.hbm.EntityElement;
import org.hibernate.jaxb.spi.hbm.JaxbAnyElement;
Expand Down Expand Up @@ -444,12 +445,18 @@ public CustomSQL getCustomSqlDelete() {
}

@Override
public List<String> getSynchronizedTableNames() {
List<String> tableNames = new ArrayList<String>();
for ( JaxbSynchronizeElement synchronizeElement : entityElement.getSynchronize() ) {
tableNames.add( synchronizeElement.getTable() );
public String[] getSynchronizedTableNames() {
if ( CollectionHelper.isEmpty( entityElement.getSynchronize() ) ) {
return StringHelper.EMPTY_STRINGS;
}
else {
final int size = entityElement.getSynchronize().size();
final String[] synchronizedTableNames = new String[size];
for ( int i = 0; i < size; i++ ) {
synchronizedTableNames[i] = entityElement.getSynchronize().get( i ).getTable();
}
return synchronizedTableNames;
}
return tableNames;
}

@Override
Expand Down
Expand Up @@ -34,7 +34,9 @@
import org.hibernate.AssertionFailure;
import org.hibernate.EntityMode;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.ValueHolder;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.internal.util.collections.JoinedIterable;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.collections.SingletonIterator;
Expand Down Expand Up @@ -102,7 +104,7 @@ public class EntityBinding extends AbstractAttributeBindingContainer {
private CustomSQL customUpdate;
private CustomSQL customDelete;

private Set<String> synchronizedTableNames = new HashSet<String>();
private String[] synchronizedTableNames = StringHelper.EMPTY_STRINGS;
private Map<String, AttributeBinding> attributeBindingMap = new HashMap<String, AttributeBinding>();

private List<JpaCallbackSource> jpaCallbackClasses = new ArrayList<JpaCallbackSource>();
Expand Down Expand Up @@ -435,12 +437,12 @@ public void setAbstract(Boolean isAbstract) {
this.isAbstract = isAbstract;
}

public Set<String> getSynchronizedTableNames() {
public String[] getSynchronizedTableNames() {
return synchronizedTableNames;
}

public void addSynchronizedTableNames(java.util.Collection<String> synchronizedTableNames) {
this.synchronizedTableNames.addAll( synchronizedTableNames );
public void addSynchronizedTableNames(String [] synchronizedTableNames) {
this.synchronizedTableNames = ArrayHelper.join( this.synchronizedTableNames, synchronizedTableNames );
}

public String getEntityName() {
Expand Down
Expand Up @@ -72,11 +72,20 @@ public Column locateOrCreateColumn(String name) {
public Column locateColumn(String name) {
final Identifier identifier = Identifier.toIdentifier( name );
if ( valueMap.containsKey( identifier ) ) {
return (Column) valueMap.get( identifier );
Value value = valueMap.get( identifier );
return Column.class.isInstance( value ) ? Column.class.cast( value ) : null;
}
return null;
}

@Override
public boolean hasValue(Value value) {
//shortcut
if ( this != value.getTable() ) {
return false;
}
return valueMap.containsValue( value );
}

@Override
public Column createColumn(String name) {
Expand All @@ -95,7 +104,10 @@ public Column createColumn(Identifier name) {
public DerivedValue locateOrCreateDerivedValue(String fragment) {
final Identifier identifier = Identifier.toIdentifier( fragment );
if ( valueMap.containsKey( identifier ) ) {
return (DerivedValue) valueMap.get( identifier );
Value value = valueMap.get( identifier );
if ( DerivedValue.class.isInstance( value ) ) {
return DerivedValue.class.cast( value );
}
}
final DerivedValue value = new DerivedValue( this, valueList.size(), fragment );
valueMap.put( identifier, value );
Expand Down
Expand Up @@ -284,6 +284,7 @@ public String[] sqlAlterStrings(TableInformation tableInformation, JdbcEnvironme
*/
public Iterable<Column> sortedColumns() {
final Set<Column> sortedColumns = new LinkedHashSet<Column>();

// Adding primary key columns.
sortedColumns.addAll( getPrimaryKey().getColumns() );
// Adding foreign key columns.
Expand Down
Expand Up @@ -41,6 +41,8 @@ public interface ValueContainer {
*/
public List<Value> values();

public boolean hasValue(Value value);

/**
* Get a qualifier which can be used to qualify {@link Value values} belonging to this container in
* their logging.
Expand Down
Expand Up @@ -184,9 +184,9 @@ public interface EntitySource extends SubclassEntityContainer, AttributeSourceCo
/**
* Obtain any additional table names on which to synchronize (auto flushing) this entity.
*
* @return Additional synchronized table names.
* @return Additional synchronized table names or 0 sized String array, never return null.
*/
public List<String> getSynchronizedTableNames();
public String[] getSynchronizedTableNames();

/**
* Get the actual discriminator value in case of a single table inheritance
Expand Down
Expand Up @@ -504,7 +504,7 @@ public SingleTableEntityPersister(

spaces = ArrayHelper.join(
qualifiedTableNames,
ArrayHelper.toStringArray( entityBinding.getSynchronizedTableNames() )
entityBinding.getSynchronizedTableNames()
);

final boolean lazyAvailable = isInstrumented();
Expand Down

0 comments on commit 9b3e6a3

Please sign in to comment.