Skip to content

Commit 9b3e6a3

Browse files
committed
HHH-7380 - union subclass support
1 parent 73f9df1 commit 9b3e6a3

File tree

16 files changed

+316
-52
lines changed

16 files changed

+316
-52
lines changed

hibernate-core/src/main/java/org/hibernate/id/factory/internal/DefaultIdentifierGeneratorFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public DefaultIdentifierGeneratorFactory() {
8888
register( "enhanced-sequence", SequenceStyleGenerator.class );
8989
register( "enhanced-table", TableGenerator.class );
9090
}
91-
91+
@Override
9292
public void register(String strategy, Class generatorClass) {
9393
LOG.debugf( "Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName() );
9494
final Class previous = generatorStrategyToClassNameMap.put( strategy, generatorClass );

hibernate-core/src/main/java/org/hibernate/internal/util/StringHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public final class StringHelper {
3737

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

4142
private StringHelper() { /* static methods only - hide constructor */
4243
}

hibernate-core/src/main/java/org/hibernate/internal/util/collections/ArrayHelper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,14 @@ public static boolean isEquals(Object[] o1, Object[] o2) {
347347
return true;
348348
}
349349

350+
public static boolean isEmpty(final Object[] arrays) {
351+
return arrays == null || arrays.length == 0;
352+
}
353+
354+
public static boolean isNotEmpty(final Object[] arrays) {
355+
return !isEmpty( arrays );
356+
}
357+
350358
/**
351359
* Compare 2 arrays only at the first level
352360
*/

hibernate-core/src/main/java/org/hibernate/metamodel/internal/Binder.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -854,15 +854,17 @@ private void bindSubEntityPrimaryKey(final EntityBinding entityBinding, final En
854854
final boolean hasPrimaryKeyJoinColumns = CollectionHelper.isNotEmpty( primaryKeyJoinColumnSources );
855855
final List<Column> superEntityBindingPrimaryKeyColumns = superEntityBinding.getPrimaryTable().getPrimaryKey().getColumns();
856856

857-
for ( int i = 0; i < superEntityBindingPrimaryKeyColumns.size(); i++ ) {
857+
for ( int i = 0, size = superEntityBindingPrimaryKeyColumns.size(); i < size; i++ ) {
858858
Column superEntityBindingPrimaryKeyColumn = superEntityBindingPrimaryKeyColumns.get( i );
859859
PrimaryKeyJoinColumnSource primaryKeyJoinColumnSource = hasPrimaryKeyJoinColumns && i < primaryKeyJoinColumnSources
860860
.size() ? primaryKeyJoinColumnSources.get( i ) : null;
861861
final String columnName;
862862
if ( primaryKeyJoinColumnSource != null && StringHelper.isNotEmpty( primaryKeyJoinColumnSource.getColumnName() ) ) {
863-
columnName = bindingContext().getNamingStrategy().columnName( primaryKeyJoinColumnSource.getColumnName() );
864-
} else {
865-
columnName = superEntityBindingPrimaryKeyColumn.getColumnName().getText();
863+
columnName = bindingContext().getNamingStrategy()
864+
.columnName( primaryKeyJoinColumnSource.getColumnName() );
865+
}
866+
else {
867+
columnName = superEntityBindingPrimaryKeyColumn.getColumnName().getText();
866868
}
867869
Column column = entityBinding.getPrimaryTable().locateOrCreateColumn( columnName );
868870
column.setCheckCondition( superEntityBindingPrimaryKeyColumn.getCheckCondition() );
@@ -873,12 +875,10 @@ private void bindSubEntityPrimaryKey(final EntityBinding entityBinding, final En
873875
column.setReadFragment( superEntityBindingPrimaryKeyColumn.getReadFragment() );
874876
column.setWriteFragment( superEntityBindingPrimaryKeyColumn.getWriteFragment() );
875877
column.setUnique( superEntityBindingPrimaryKeyColumn.isUnique() );
876-
final String sqlType;
877-
if(primaryKeyJoinColumnSource!=null && StringHelper.isNotEmpty( primaryKeyJoinColumnSource.getColumnDefinition() )){
878-
sqlType = primaryKeyJoinColumnSource.getColumnDefinition();
879-
} else {
880-
sqlType = superEntityBindingPrimaryKeyColumn.getSqlType();
881-
}
878+
final String sqlType = getSqlTypeFromPrimaryKeyJoinColumnSourceIfExist(
879+
superEntityBindingPrimaryKeyColumn,
880+
primaryKeyJoinColumnSource
881+
);
882882
column.setSqlType( sqlType );
883883
column.setSize( superEntityBindingPrimaryKeyColumn.getSize() );
884884
column.setJdbcDataType( superEntityBindingPrimaryKeyColumn.getJdbcDataType() );
@@ -889,6 +889,14 @@ private void bindSubEntityPrimaryKey(final EntityBinding entityBinding, final En
889889
}
890890
}
891891

892+
private String getSqlTypeFromPrimaryKeyJoinColumnSourceIfExist(Column superEntityBindingPrimaryKeyColumn, PrimaryKeyJoinColumnSource primaryKeyJoinColumnSource) {
893+
final boolean isColumnDefOverrided = primaryKeyJoinColumnSource != null && StringHelper.isNotEmpty(
894+
primaryKeyJoinColumnSource.getColumnDefinition()
895+
);
896+
return isColumnDefOverrided ? primaryKeyJoinColumnSource.getColumnDefinition() : superEntityBindingPrimaryKeyColumn
897+
.getSqlType();
898+
}
899+
892900
/**
893901
* Binding a single entity hierarchy.
894902
*

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/EntitySourceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public CustomSQL getCustomSqlDelete() {
195195
}
196196

197197
@Override
198-
public List<String> getSynchronizedTableNames() {
198+
public String[] getSynchronizedTableNames() {
199199
return entityClass.getSynchronizedTableNames();
200200
}
201201

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/entity/EntityClass.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public class EntityClass extends ConfiguredClass {
8181

8282
private final String explicitEntityName;
8383
private final String customLoaderQueryName;
84-
private final List<String> synchronizedTableNames;
84+
private final String[] synchronizedTableNames;
8585
private final int batchSize;
8686

8787
private boolean isImmutable;
@@ -215,7 +215,7 @@ public CustomSQL getCustomDelete() {
215215
return customDelete;
216216
}
217217

218-
public List<String> getSynchronizedTableNames() {
218+
public String[] getSynchronizedTableNames() {
219219
return synchronizedTableNames;
220220
}
221221

@@ -495,16 +495,15 @@ private String determineCustomLoader() {
495495
return customLoader;
496496
}
497497

498-
private List<String> determineSynchronizedTableNames() {
498+
private String[] determineSynchronizedTableNames() {
499499
final AnnotationInstance synchronizeAnnotation = JandexHelper.getSingleAnnotation(
500500
getClassInfo(), HibernateDotNames.SYNCHRONIZE
501501
);
502502
if ( synchronizeAnnotation != null ) {
503-
final String[] tableNames = synchronizeAnnotation.value().asStringArray();
504-
return Arrays.asList( tableNames );
503+
return synchronizeAnnotation.value().asStringArray();
505504
}
506505
else {
507-
return Collections.emptyList();
506+
return StringHelper.EMPTY_STRINGS;
508507
}
509508
}
510509

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/hbm/AbstractEntitySourceImpl.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import org.hibernate.EntityMode;
3333
import org.hibernate.internal.util.StringHelper;
34+
import org.hibernate.internal.util.collections.CollectionHelper;
3435
import org.hibernate.jaxb.spi.Origin;
3536
import org.hibernate.jaxb.spi.hbm.EntityElement;
3637
import org.hibernate.jaxb.spi.hbm.JaxbAnyElement;
@@ -444,12 +445,18 @@ public CustomSQL getCustomSqlDelete() {
444445
}
445446

446447
@Override
447-
public List<String> getSynchronizedTableNames() {
448-
List<String> tableNames = new ArrayList<String>();
449-
for ( JaxbSynchronizeElement synchronizeElement : entityElement.getSynchronize() ) {
450-
tableNames.add( synchronizeElement.getTable() );
448+
public String[] getSynchronizedTableNames() {
449+
if ( CollectionHelper.isEmpty( entityElement.getSynchronize() ) ) {
450+
return StringHelper.EMPTY_STRINGS;
451+
}
452+
else {
453+
final int size = entityElement.getSynchronize().size();
454+
final String[] synchronizedTableNames = new String[size];
455+
for ( int i = 0; i < size; i++ ) {
456+
synchronizedTableNames[i] = entityElement.getSynchronize().get( i ).getTable();
457+
}
458+
return synchronizedTableNames;
451459
}
452-
return tableNames;
453460
}
454461

455462
@Override

hibernate-core/src/main/java/org/hibernate/metamodel/spi/binding/EntityBinding.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import org.hibernate.AssertionFailure;
3535
import org.hibernate.EntityMode;
3636
import org.hibernate.engine.spi.FilterDefinition;
37+
import org.hibernate.internal.util.StringHelper;
3738
import org.hibernate.internal.util.ValueHolder;
39+
import org.hibernate.internal.util.collections.ArrayHelper;
3840
import org.hibernate.internal.util.collections.JoinedIterable;
3941
import org.hibernate.internal.util.collections.JoinedIterator;
4042
import org.hibernate.internal.util.collections.SingletonIterator;
@@ -102,7 +104,7 @@ public class EntityBinding extends AbstractAttributeBindingContainer {
102104
private CustomSQL customUpdate;
103105
private CustomSQL customDelete;
104106

105-
private Set<String> synchronizedTableNames = new HashSet<String>();
107+
private String[] synchronizedTableNames = StringHelper.EMPTY_STRINGS;
106108
private Map<String, AttributeBinding> attributeBindingMap = new HashMap<String, AttributeBinding>();
107109

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

438-
public Set<String> getSynchronizedTableNames() {
440+
public String[] getSynchronizedTableNames() {
439441
return synchronizedTableNames;
440442
}
441443

442-
public void addSynchronizedTableNames(java.util.Collection<String> synchronizedTableNames) {
443-
this.synchronizedTableNames.addAll( synchronizedTableNames );
444+
public void addSynchronizedTableNames(String [] synchronizedTableNames) {
445+
this.synchronizedTableNames = ArrayHelper.join( this.synchronizedTableNames, synchronizedTableNames );
444446
}
445447

446448
public String getEntityName() {

hibernate-core/src/main/java/org/hibernate/metamodel/spi/relational/AbstractTableSpecification.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,20 @@ public Column locateOrCreateColumn(String name) {
7272
public Column locateColumn(String name) {
7373
final Identifier identifier = Identifier.toIdentifier( name );
7474
if ( valueMap.containsKey( identifier ) ) {
75-
return (Column) valueMap.get( identifier );
75+
Value value = valueMap.get( identifier );
76+
return Column.class.isInstance( value ) ? Column.class.cast( value ) : null;
7677
}
7778
return null;
7879
}
7980

81+
@Override
82+
public boolean hasValue(Value value) {
83+
//shortcut
84+
if ( this != value.getTable() ) {
85+
return false;
86+
}
87+
return valueMap.containsValue( value );
88+
}
8089

8190
@Override
8291
public Column createColumn(String name) {
@@ -95,7 +104,10 @@ public Column createColumn(Identifier name) {
95104
public DerivedValue locateOrCreateDerivedValue(String fragment) {
96105
final Identifier identifier = Identifier.toIdentifier( fragment );
97106
if ( valueMap.containsKey( identifier ) ) {
98-
return (DerivedValue) valueMap.get( identifier );
107+
Value value = valueMap.get( identifier );
108+
if ( DerivedValue.class.isInstance( value ) ) {
109+
return DerivedValue.class.cast( value );
110+
}
99111
}
100112
final DerivedValue value = new DerivedValue( this, valueList.size(), fragment );
101113
valueMap.put( identifier, value );

hibernate-core/src/main/java/org/hibernate/metamodel/spi/relational/Table.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ public String[] sqlAlterStrings(TableInformation tableInformation, JdbcEnvironme
284284
*/
285285
public Iterable<Column> sortedColumns() {
286286
final Set<Column> sortedColumns = new LinkedHashSet<Column>();
287+
287288
// Adding primary key columns.
288289
sortedColumns.addAll( getPrimaryKey().getColumns() );
289290
// Adding foreign key columns.

hibernate-core/src/main/java/org/hibernate/metamodel/spi/relational/ValueContainer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public interface ValueContainer {
4141
*/
4242
public List<Value> values();
4343

44+
public boolean hasValue(Value value);
45+
4446
/**
4547
* Get a qualifier which can be used to qualify {@link Value values} belonging to this container in
4648
* their logging.

hibernate-core/src/main/java/org/hibernate/metamodel/spi/source/EntitySource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@ public interface EntitySource extends SubclassEntityContainer, AttributeSourceCo
184184
/**
185185
* Obtain any additional table names on which to synchronize (auto flushing) this entity.
186186
*
187-
* @return Additional synchronized table names.
187+
* @return Additional synchronized table names or 0 sized String array, never return null.
188188
*/
189-
public List<String> getSynchronizedTableNames();
189+
public String[] getSynchronizedTableNames();
190190

191191
/**
192192
* Get the actual discriminator value in case of a single table inheritance

hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ public SingleTableEntityPersister(
504504

505505
spaces = ArrayHelper.join(
506506
qualifiedTableNames,
507-
ArrayHelper.toStringArray( entityBinding.getSynchronizedTableNames() )
507+
entityBinding.getSynchronizedTableNames()
508508
);
509509

510510
final boolean lazyAvailable = isInstrumented();

0 commit comments

Comments
 (0)