get rid of the iterators in the mapping package

and clean up a lot of warnings
This commit is contained in:
Gavin King 2022-01-26 14:04:09 +01:00
parent 766d519ddd
commit 54b9677d99
74 changed files with 1036 additions and 1029 deletions

View File

@ -33,7 +33,6 @@ import org.hibernate.boot.model.naming.ImplicitCollectionTableNameSource;
import org.hibernate.boot.model.naming.ImplicitEntityNameSource;
import org.hibernate.boot.model.naming.ImplicitIdentifierColumnNameSource;
import org.hibernate.boot.model.naming.ImplicitIndexColumnNameSource;
import org.hibernate.boot.model.naming.ImplicitJoinColumnNameSource;
import org.hibernate.boot.model.naming.ImplicitMapKeyColumnNameSource;
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.ImplicitUniqueKeyNameSource;
@ -733,29 +732,26 @@ public class ModelBinder {
( (RelationalValueSourceContainer) idSource.getIdentifierAttributeSource() ).getRelationalValueSources(),
idValue,
false,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
context.getBuildingOptions().getImplicitNamingStrategy().determineIdentifierColumnName(
new ImplicitIdentifierColumnNameSource() {
@Override
public EntityNaming getEntityNaming() {
return hierarchySource.getRoot().getEntityNamingSource();
}
@Override
public AttributePath getIdentifierAttributePath() {
return idSource.getIdentifierAttributeSource().getAttributePath();
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
context -> {
context.getBuildingOptions().getImplicitNamingStrategy().determineIdentifierColumnName(
new ImplicitIdentifierColumnNameSource() {
@Override
public EntityNaming getEntityNaming() {
return hierarchySource.getRoot().getEntityNamingSource();
}
);
return database.toIdentifier( propertyName );
}
@Override
public AttributePath getIdentifierAttributePath() {
return idSource.getIdentifierAttributeSource().getAttributePath();
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
);
return database.toIdentifier( propertyName );
}
);
@ -1007,12 +1003,7 @@ public class ModelBinder {
versionAttributeSource.getRelationalValueSources(),
versionValue,
false,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(LocalMetadataBuildingContext context) {
return implicitNamingStrategy.determineBasicColumnName( versionAttributeSource );
}
}
context -> implicitNamingStrategy.determineBasicColumnName( versionAttributeSource )
);
Property prop = new Property();
@ -1072,14 +1063,9 @@ public class ModelBinder {
hierarchySource.getDiscriminatorSource().getDiscriminatorRelationalValueSource(),
discriminatorValue,
false,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
return implicitNamingStrategy.determineDiscriminatorColumnName(
hierarchySource.getDiscriminatorSource()
);
}
}
context -> implicitNamingStrategy.determineDiscriminatorColumnName(
hierarchySource.getDiscriminatorSource()
)
);
rootEntityDescriptor.setPolymorphic( true );
@ -1124,7 +1110,7 @@ public class ModelBinder {
}
for ( AttributeSource attributeSource : entitySource.attributeSources() ) {
if ( PluralAttributeSource.class.isInstance( attributeSource ) ) {
if ( attributeSource instanceof PluralAttributeSource ) {
// plural attribute
final Property attribute = createPluralAttribute(
mappingDocument,
@ -1135,7 +1121,7 @@ public class ModelBinder {
}
else {
// singular attribute
if ( SingularAttributeSourceBasic.class.isInstance( attributeSource ) ) {
if ( attributeSource instanceof SingularAttributeSourceBasic ) {
final SingularAttributeSourceBasic basicAttributeSource = (SingularAttributeSourceBasic) attributeSource;
final Identifier tableName = determineTable( mappingDocument, basicAttributeSource.getName(), basicAttributeSource );
final AttributeContainer attributeContainer;
@ -1170,7 +1156,7 @@ public class ModelBinder {
basicAttributeSource.getNaturalIdMutability()
);
}
else if ( SingularAttributeSourceEmbedded.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceEmbedded ) {
final SingularAttributeSourceEmbedded embeddedAttributeSource = (SingularAttributeSourceEmbedded) attributeSource;
final Identifier tableName = determineTable( mappingDocument, embeddedAttributeSource );
final AttributeContainer attributeContainer;
@ -1205,7 +1191,7 @@ public class ModelBinder {
embeddedAttributeSource.getNaturalIdMutability()
);
}
else if ( SingularAttributeSourceManyToOne.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceManyToOne ) {
final SingularAttributeSourceManyToOne manyToOneAttributeSource = (SingularAttributeSourceManyToOne) attributeSource;
final Identifier tableName = determineTable( mappingDocument, manyToOneAttributeSource.getName(), manyToOneAttributeSource );
final AttributeContainer attributeContainer;
@ -1240,7 +1226,7 @@ public class ModelBinder {
manyToOneAttributeSource.getNaturalIdMutability()
);
}
else if ( SingularAttributeSourceOneToOne.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceOneToOne ) {
final SingularAttributeSourceOneToOne oneToOneAttributeSource = (SingularAttributeSourceOneToOne) attributeSource;
final Table table = entityDescriptor.getTable();
final Property attribute = createOneToOneAttribute(
@ -1258,7 +1244,7 @@ public class ModelBinder {
oneToOneAttributeSource.getNaturalIdMutability()
);
}
else if ( SingularAttributeSourceAny.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceAny ) {
final SingularAttributeSourceAny anyAttributeSource = (SingularAttributeSourceAny) attributeSource;
final Identifier tableName = determineTable(
mappingDocument,
@ -1458,7 +1444,7 @@ public class ModelBinder {
// bind the collection type info
String typeName = source.getTypeInformation().getName();
Map typeParameters = new HashMap();
Map<Object,Object> typeParameters = new HashMap<>();
if ( typeName != null ) {
// see if there is a corresponding type-def
final TypeDefinition typeDef = mappingDocument.getMetadataCollector().getTypeDefinition( typeName );
@ -1652,7 +1638,7 @@ public class ModelBinder {
Identifier tableName = null;
for ( AttributeSource attributeSource : embeddedAttributeSource.getEmbeddableSource().attributeSources() ) {
final Identifier determinedName;
if ( RelationalValueSourceContainer.class.isInstance( attributeSource ) ) {
if ( attributeSource instanceof RelationalValueSourceContainer ) {
determinedName = determineTable(
mappingDocument,
embeddedAttributeSource.getAttributeRole().getFullPath(),
@ -1660,10 +1646,10 @@ public class ModelBinder {
);
}
else if ( SingularAttributeSourceEmbedded.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceEmbedded ) {
determinedName = determineTable( mappingDocument, (SingularAttributeSourceEmbedded) attributeSource );
}
else if ( SingularAttributeSourceAny.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceAny ) {
determinedName = determineTable(
mappingDocument,
attributeSource.getAttributeRole().getFullPath(),
@ -1901,12 +1887,7 @@ public class ModelBinder {
attributeSource.getRelationalValueSources(),
value,
attributeSource.areValuesNullableByDefault(),
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(LocalMetadataBuildingContext context) {
return implicitNamingStrategy.determineBasicColumnName( attributeSource );
}
}
context -> implicitNamingStrategy.determineBasicColumnName( attributeSource )
);
@ -2181,7 +2162,7 @@ public class ModelBinder {
referencedEntityName = manyToOneSource.getReferencedEntityName();
}
else {
Class reflectedPropertyClass = Helper.reflectedPropertyClass( sourceDocument, containingClassName, attributeName );
Class<?> reflectedPropertyClass = Helper.reflectedPropertyClass( sourceDocument, containingClassName, attributeName );
if ( reflectedPropertyClass != null ) {
referencedEntityName = reflectedPropertyClass.getName();
}
@ -2615,9 +2596,9 @@ public class ModelBinder {
.append( "Mapped property: " )
.append( propertySource.getName() )
.append( " -> [" );
final Iterator itr = property.getValue().getColumnIterator();
final Iterator<Selectable> itr = property.getValue().getColumnIterator();
while ( itr.hasNext() ) {
message.append( ( (Selectable) itr.next() ).getText() );
message.append( itr.next().getText() );
if ( itr.hasNext() ) {
message.append( ", " );
}
@ -2706,7 +2687,7 @@ public class ModelBinder {
}
else if ( componentBinding.getOwner().hasPojoRepresentation() ) {
log.tracef( "Attempting to determine component class by reflection %s", role );
final Class reflectedComponentClass;
final Class<?> reflectedComponentClass;
if ( StringHelper.isNotEmpty( containingClassName ) && StringHelper.isNotEmpty( propertyName ) ) {
reflectedComponentClass = Helper.reflectedPropertyClass(
sourceDocument,
@ -2747,40 +2728,25 @@ public class ModelBinder {
if ( embeddableSource.isUnique() ) {
final ArrayList<Column> cols = new ArrayList<>();
final Iterator itr = componentBinding.getColumnIterator();
while ( itr.hasNext() ) {
final Object selectable = itr.next();
// skip formulas. ugh, yes terrible naming of these methods :(
if ( !Column.class.isInstance( selectable ) ) {
continue;
for ( Selectable selectable: componentBinding.getSelectables() ) {
if ( selectable instanceof Column) {
cols.add( (Column) selectable );
}
cols.add( (Column) selectable );
}
// todo : we may need to delay this
componentBinding.getOwner().getTable().createUniqueKey( cols );
}
}
private void prepareComponentType(
MappingDocument sourceDocument,
String fullRole,
Component componentBinding,
String explicitComponentClassName,
String containingClassName,
String propertyName,
boolean isVirtual,
boolean isDynamic) {
}
private void bindAllCompositeAttributes(
MappingDocument sourceDocument,
EmbeddableSource embeddableSource,
Component component) {
for ( AttributeSource attributeSource : embeddableSource.attributeSources() ) {
Property attribute = null;
Property attribute;
if ( SingularAttributeSourceBasic.class.isInstance( attributeSource ) ) {
if ( attributeSource instanceof SingularAttributeSourceBasic ) {
attribute = createBasicAttribute(
sourceDocument,
(SingularAttributeSourceBasic) attributeSource,
@ -2788,7 +2754,7 @@ public class ModelBinder {
component.getComponentClassName()
);
}
else if ( SingularAttributeSourceEmbedded.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceEmbedded ) {
attribute = createEmbeddedAttribute(
sourceDocument,
(SingularAttributeSourceEmbedded) attributeSource,
@ -2796,7 +2762,7 @@ public class ModelBinder {
component.getComponentClassName()
);
}
else if ( SingularAttributeSourceManyToOne.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceManyToOne ) {
attribute = createManyToOneAttribute(
sourceDocument,
(SingularAttributeSourceManyToOne) attributeSource,
@ -2804,7 +2770,7 @@ public class ModelBinder {
component.getComponentClassName()
);
}
else if ( SingularAttributeSourceOneToOne.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceOneToOne ) {
attribute = createOneToOneAttribute(
sourceDocument,
(SingularAttributeSourceOneToOne) attributeSource,
@ -2812,7 +2778,7 @@ public class ModelBinder {
component.getComponentClassName()
);
}
else if ( SingularAttributeSourceAny.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof SingularAttributeSourceAny ) {
attribute = createAnyAssociationAttribute(
sourceDocument,
(SingularAttributeSourceAny) attributeSource,
@ -2820,7 +2786,7 @@ public class ModelBinder {
component.getComponentClassName()
);
}
else if ( PluralAttributeSource.class.isInstance( attributeSource ) ) {
else if ( attributeSource instanceof PluralAttributeSource ) {
attribute = createPluralAttribute(
sourceDocument,
(PluralAttributeSource) attributeSource,
@ -2917,8 +2883,8 @@ public class ModelBinder {
determineSchemaName( tableSpecSource )
);
final boolean isTable = TableSource.class.isInstance( tableSpecSource );
final boolean isAbstract = entityDescriptor.isAbstract() == null ? false : entityDescriptor.isAbstract();
final boolean isTable = tableSpecSource instanceof TableSource;
final boolean isAbstract = entityDescriptor.isAbstract() != null && entityDescriptor.isAbstract();
final String subselect;
final Identifier logicalTableName;
final Table table;
@ -2991,7 +2957,6 @@ public class ModelBinder {
EntityTableXref superEntityTableXref = null;
if ( entitySource.getSuperType() != null ) {
//noinspection SuspiciousMethodCalls
final String superEntityName = ( (EntitySource) entitySource.getSuperType() ).getEntityNamingSource()
.getEntityName();
superEntityTableXref = mappingDocument.getMetadataCollector().getEntityTableXref( superEntityName );
@ -3406,27 +3371,22 @@ public class ModelBinder {
);
key.setForeignKeyName( keySource.getExplicitForeignKeyName() );
key.setCascadeDeleteEnabled( getPluralAttributeSource().getKeySource().isCascadeDeleteEnabled() );
final ImplicitJoinColumnNameSource.Nature implicitNamingNature;
if ( getPluralAttributeSource().getElementSource() instanceof PluralAttributeElementSourceManyToMany
|| getPluralAttributeSource().getElementSource() instanceof PluralAttributeElementSourceOneToMany ) {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY_COLLECTION;
}
else {
implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ELEMENT_COLLECTION;
}
//
// final ImplicitJoinColumnNameSource.Nature implicitNamingNature;
// if ( getPluralAttributeSource().getElementSource() instanceof PluralAttributeElementSourceManyToMany
// || getPluralAttributeSource().getElementSource() instanceof PluralAttributeElementSourceOneToMany ) {
// implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ENTITY_COLLECTION;
// }
// else {
// implicitNamingNature = ImplicitJoinColumnNameSource.Nature.ELEMENT_COLLECTION;
// }
relationalObjectBinder.bindColumnsAndFormulas(
mappingDocument,
getPluralAttributeSource().getKeySource().getRelationalValueSources(),
key,
getPluralAttributeSource().getKeySource().areValuesNullableByDefault(),
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
return context.getMetadataCollector().getDatabase().toIdentifier( Collection.DEFAULT_KEY_COLUMN_NAME );
}
}
context -> context.getMetadataCollector().getDatabase().toIdentifier( Collection.DEFAULT_KEY_COLUMN_NAME )
);
key.sortProperties();
@ -3457,12 +3417,7 @@ public class ModelBinder {
idSource.getColumnSource(),
idBinding,
false,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(LocalMetadataBuildingContext context) {
return database.toIdentifier( IdentifierCollection.DEFAULT_IDENTIFIER_COLUMN_NAME );
}
}
context -> database.toIdentifier( IdentifierCollection.DEFAULT_IDENTIFIER_COLUMN_NAME )
);
idBagBinding.setIdentifier( idBinding );
@ -3506,12 +3461,7 @@ public class ModelBinder {
elementSource.getRelationalValueSources(),
elementBinding,
elementSource.areValuesNullableByDefault(),
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(LocalMetadataBuildingContext context) {
return context.getMetadataCollector().getDatabase().toIdentifier( Collection.DEFAULT_ELEMENT_COLUMN_NAME );
}
}
context -> context.getMetadataCollector().getDatabase().toIdentifier( Collection.DEFAULT_ELEMENT_COLUMN_NAME )
);
getCollectionBinding().setElement( elementBinding );
@ -3593,14 +3543,8 @@ public class ModelBinder {
elementSource.getRelationalValueSources(),
elementBinding,
false,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
return context.getMetadataCollector()
.getDatabase()
.toIdentifier( Collection.DEFAULT_ELEMENT_COLUMN_NAME );
}
}
context -> context.getMetadataCollector().getDatabase()
.toIdentifier( Collection.DEFAULT_ELEMENT_COLUMN_NAME )
);
elementBinding.setLazy(
@ -3829,10 +3773,10 @@ public class ModelBinder {
super.createBackReferences();
boolean indexIsFormula = false;
Iterator itr = getCollectionBinding().getIndex().getColumnIterator();
while ( itr.hasNext() ) {
if ( ( (Selectable) itr.next() ).isFormula() ) {
for ( Selectable selectable: getCollectionBinding().getIndex().getSelectables() ) {
if ( selectable.isFormula() ) {
indexIsFormula = true;
break;
}
}
@ -3993,24 +3937,19 @@ public class ModelBinder {
indexSource.getRelationalValueSources(),
indexBinding,
attributeSource.getElementSource() instanceof PluralAttributeElementSourceOneToMany,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
return context.getBuildingOptions().getImplicitNamingStrategy().determineListIndexColumnName(
new ImplicitIndexColumnNameSource() {
@Override
public AttributePath getPluralAttributePath() {
return attributeSource.getAttributePath();
}
context -> context.getBuildingOptions().getImplicitNamingStrategy().determineListIndexColumnName(
new ImplicitIndexColumnNameSource() {
@Override
public AttributePath getPluralAttributePath() {
return attributeSource.getAttributePath();
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
);
}
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
)
);
collectionBinding.setIndex( indexBinding );
@ -4046,12 +3985,7 @@ public class ModelBinder {
mapKeySource.getRelationalValueSources(),
value,
true,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(LocalMetadataBuildingContext context) {
return database.toIdentifier( IndexedCollection.DEFAULT_INDEX_COLUMN_NAME );
}
}
context -> database.toIdentifier( IndexedCollection.DEFAULT_INDEX_COLUMN_NAME )
);
collectionBinding.setIndex( value );
@ -4089,24 +4023,19 @@ public class ModelBinder {
mapKeySource.getRelationalValueSources(),
mapKeyBinding,
true,
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
return implicitNamingStrategy.determineMapKeyColumnName(
new ImplicitMapKeyColumnNameSource() {
@Override
public AttributePath getPluralAttributePath() {
return pluralAttributeSource.getAttributePath();
}
context -> implicitNamingStrategy.determineMapKeyColumnName(
new ImplicitMapKeyColumnNameSource() {
@Override
public AttributePath getPluralAttributePath() {
return pluralAttributeSource.getAttributePath();
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
);
}
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
)
);
collectionBinding.setIndex( mapKeyBinding );
}
@ -4186,11 +4115,8 @@ public class ModelBinder {
manyToOneSource.getRelationalValueSources(),
manyToOneBinding,
manyToOneSource.areValuesNullableByDefault(),
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(LocalMetadataBuildingContext context) {
throw new AssertionFailure( "Argh!!!" );
}
context -> {
throw new AssertionFailure( "Argh!!!" );
}
);
}
@ -4214,29 +4140,24 @@ public class ModelBinder {
manyToOneSource.getRelationalValueSources(),
manyToOneBinding,
manyToOneSource.areValuesNullableByDefault(),
new RelationalObjectBinder.ColumnNamingDelegate() {
@Override
public Identifier determineImplicitName(final LocalMetadataBuildingContext context) {
return implicitNamingStrategy.determineBasicColumnName(
new ImplicitBasicColumnNameSource() {
@Override
public AttributePath getAttributePath() {
return manyToOneSource.getAttributePath();
}
context -> implicitNamingStrategy.determineBasicColumnName(
new ImplicitBasicColumnNameSource() {
@Override
public AttributePath getAttributePath() {
return manyToOneSource.getAttributePath();
}
@Override
public boolean isCollectionElement() {
return false;
}
@Override
public boolean isCollectionElement() {
return false;
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
);
}
}
@Override
public MetadataBuildingContext getBuildingContext() {
return context;
}
}
)
);
}
}
@ -4327,10 +4248,8 @@ public class ModelBinder {
final UniqueKey uk = new UniqueKey();
uk.setTable( entityBinding.getTable() );
for ( Property attributeBinding : attributeBindings ) {
final Iterator itr = attributeBinding.getColumnIterator();
while ( itr.hasNext() ) {
final Object selectable = itr.next();
if ( Column.class.isInstance( selectable ) ) {
for ( Selectable selectable : attributeBinding.getSelectables() ) {
if ( selectable instanceof Column ) {
final Column column = (Column) selectable;
uk.addColumn( column );
columnNames.add(
@ -4338,7 +4257,7 @@ public class ModelBinder {
);
}
}
uk.addColumns( attributeBinding.getColumnIterator() );
uk.addColumns( attributeBinding.getValue() );
}
final Identifier ukName = mappingDocument.getBuildingOptions().getImplicitNamingStrategy().determineUniqueKeyName(

View File

@ -7,7 +7,6 @@
package org.hibernate.cfg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -345,7 +344,7 @@ public class AnnotatedJoinColumn extends AnnotatedColumn {
final ObjectNameNormalizer normalizer = context.getObjectNameNormalizer();
Column col = (Column) identifier.getColumnIterator().next();
Column col = identifier.getColumns().get(0);
String defaultName = context.getMetadataCollector().getLogicalColumnName(
identifier.getTable(),
col.getQuotedName()
@ -449,17 +448,14 @@ public class AnnotatedJoinColumn extends AnnotatedColumn {
}
}
public void copyReferencedStructureAndCreateDefaultJoinColumns(
PersistentClass referencedEntity,
Iterator columnIterator,
SimpleValue referencedValue,
SimpleValue value) {
if ( !isNameDeferred() ) {
throw new AssertionFailure( "Building implicit column but the column is not implicit" );
}
while ( columnIterator.hasNext() ) {
Column synthCol = (Column) columnIterator.next();
for ( Column synthCol: referencedValue.getColumns() ) {
this.linkValueUsingDefaultColumnNaming( synthCol, referencedEntity, value );
}
//reset for the future
@ -586,8 +582,7 @@ public class AnnotatedJoinColumn extends AnnotatedColumn {
.getEntityBinding( mappedByEntityName );
final Property mappedByProperty = mappedByEntityBinding.getProperty( mappedByPropertyName );
final SimpleValue value = (SimpleValue) mappedByProperty.getValue();
final Iterator<Selectable> selectableValues = value.getColumnIterator();
if ( !selectableValues.hasNext() ) {
if ( value.getSelectables().isEmpty() ) {
throw new AnnotationException(
String.format(
Locale.ENGLISH,
@ -597,8 +592,8 @@ public class AnnotatedJoinColumn extends AnnotatedColumn {
)
);
}
final Selectable selectable = selectableValues.next();
if ( !Column.class.isInstance( selectable ) ) {
final Selectable selectable = value.getSelectables().get(0);
if ( !(selectable instanceof Column) ) {
throw new AnnotationException(
String.format(
Locale.ENGLISH,
@ -608,7 +603,7 @@ public class AnnotatedJoinColumn extends AnnotatedColumn {
)
);
}
if ( selectableValues.hasNext() ) {
if ( value.getSelectables().size()>1 ) {
throw new AnnotationException(
String.format(
Locale.ENGLISH,
@ -817,9 +812,8 @@ public class AnnotatedJoinColumn extends AnnotatedColumn {
MetadataBuildingContext context) {
//convenient container to find whether a column is an id one or not
Set<Column> idColumns = new HashSet<>();
Iterator idColumnsIt = referencedEntity.getKey().getColumnIterator();
while ( idColumnsIt.hasNext() ) {
idColumns.add( (Column) idColumnsIt.next() );
for ( Selectable selectable : referencedEntity.getKey().getSelectables() ) {
idColumns.add( (Column) selectable );
}
boolean isFkReferencedColumnName = false;

View File

@ -133,6 +133,7 @@ import org.hibernate.mapping.KeyValue;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.Selectable;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.SingleTableSubclass;
import org.hibernate.mapping.Subclass;
@ -1284,9 +1285,8 @@ public final class AnnotationBinder {
persistentClass.addProperty( property );
entityBinder.setIgnoreIdAnnotations( true );
Iterator properties = mapper.getPropertyIterator();
while ( properties.hasNext() ) {
idPropertiesIfIdClass.add( ( ( Property ) properties.next() ).getName() );
for ( Property prop : mapper.getProperties() ) {
idPropertiesIfIdClass.add( prop.getName() );
}
return true;
}
@ -3442,15 +3442,12 @@ public final class AnnotationBinder {
mapToPK = false;
}
else {
Iterator idColumns = identifier.getColumnIterator();
List<String> idColumnNames = new ArrayList<>();
org.hibernate.mapping.Column currentColumn;
if ( identifier.getColumnSpan() != joinColumns.length ) {
mapToPK = false;
}
else {
while ( idColumns.hasNext() ) {
currentColumn = ( org.hibernate.mapping.Column ) idColumns.next();
for ( org.hibernate.mapping.Column currentColumn : identifier.getColumns() ) {
idColumnNames.add( currentColumn.getName() );
}
for ( AnnotatedJoinColumn col : joinColumns ) {

View File

@ -34,11 +34,9 @@ import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.cfg.annotations.BasicValueBinder;
import org.hibernate.cfg.annotations.EntityBinder;
import org.hibernate.cfg.annotations.Nullability;
import org.hibernate.cfg.annotations.TableBinder;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.PersistentIdentifierGenerator;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.mapping.Any;
import org.hibernate.mapping.BasicValue;
@ -49,6 +47,7 @@ import org.hibernate.mapping.Join;
import org.hibernate.mapping.MappedSuperclass;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Selectable;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.SyntheticProperty;
import org.hibernate.mapping.Table;
@ -72,7 +71,6 @@ public class BinderHelper {
public static final String ANNOTATION_STRING_DEFAULT = "";
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( BinderHelper.class );
private static final Logger log = CoreLogging.logger( BinderHelper.class );
private BinderHelper() {
@ -126,7 +124,7 @@ public class BinderHelper {
columns[0].getPropertyHolder().getPersistentClass() :
null;
if ( AnnotatedJoinColumn.NON_PK_REFERENCE == fkEnum ) {
/**
/*
* Create a synthetic property to refer to including an
* embedded component value containing all the properties
* mapped to the referenced columns
@ -166,7 +164,7 @@ public class BinderHelper {
synthProp.setPropertyAccessorName( "embedded" );
ownerEntity.addProperty( synthProp );
//make it unique
TableBinder.createUniqueConstraint( embeddedComp );
embeddedComp.createUniqueKey();
}
else {
//TODO use a ToOne type doing a second select
@ -201,12 +199,12 @@ public class BinderHelper {
throw new AnnotationException( columnsList.toString() );
}
/**
/*
* creating the property ref to the new synthetic property
*/
if ( value instanceof ToOne ) {
( (ToOne) value ).setReferencedPropertyName( syntheticPropertyName );
( (ToOne) value ).setReferenceToPrimaryKey( syntheticPropertyName == null );
( (ToOne) value ).setReferenceToPrimaryKey( false );
context.getMetadataCollector().addUniquePropertyReference(
ownerEntity.getEntityName(),
syntheticPropertyName
@ -267,11 +265,11 @@ public class BinderHelper {
columnsToProperty.put( column, new HashSet<>() );
}
boolean isPersistentClass = columnOwner instanceof PersistentClass;
Iterator it = isPersistentClass ?
( (PersistentClass) columnOwner ).getPropertyIterator() :
( (Join) columnOwner ).getPropertyIterator();
while ( it.hasNext() ) {
matchColumnsByProperty( (Property) it.next(), columnsToProperty );
List<Property> properties = isPersistentClass ?
( (PersistentClass) columnOwner ).getProperties() :
( (Join) columnOwner ).getProperties();
for (Property property : properties) {
matchColumnsByProperty( property, columnsToProperty );
}
if ( isPersistentClass ) {
matchColumnsByProperty( ( (PersistentClass) columnOwner ).getIdentifierProperty(), columnsToProperty );
@ -314,13 +312,12 @@ public class BinderHelper {
// }
// }
else {
Iterator columnIt = property.getColumnIterator();
while ( columnIt.hasNext() ) {
//can be a Formula so we don't cast
Object column = columnIt.next();
for (Selectable selectable : property.getSelectables()) {
//can be a Formula, so we don't cast
//noinspection SuspiciousMethodCalls
if ( columnsToProperty.containsKey( column ) ) {
columnsToProperty.get( column ).add( property );
if ( columnsToProperty.containsKey( selectable ) ) {
//noinspection SuspiciousMethodCalls
columnsToProperty.get( selectable ).add( property );
}
}
}
@ -526,7 +523,7 @@ public class BinderHelper {
if ( id.getColumnSpan() == 1 ) {
params.setProperty(
PersistentIdentifierGenerator.PK,
( (Column) id.getColumnIterator().next() ).getName()
id.getColumns().get(0).getName()
);
}
// YUCK! but cannot think of a clean way to do this given the string-config based scheme
@ -774,7 +771,6 @@ public class BinderHelper {
);
}
@SuppressWarnings("ConstantConditions")
private static GenerationType interpretGenerationType(GeneratedValue generatedValueAnn) {
if ( generatedValueAnn.strategy() == null ) {
return GenerationType.AUTO;
@ -854,7 +850,7 @@ public class BinderHelper {
);
value.setDiscriminatorValueMappings( discriminatorValueMappings );
BasicValueBinder keyValueBinder = new BasicValueBinder( BasicValueBinder.Kind.ANY_KEY, context );
BasicValueBinder<?> keyValueBinder = new BasicValueBinder<>( BasicValueBinder.Kind.ANY_KEY, context );
assert keyColumns.length == 1;
keyColumns[0].setTable( value.getTable() );
keyValueBinder.setColumns( keyColumns );
@ -887,8 +883,8 @@ public class BinderHelper {
if ( valuesAnn != null ) {
final AnyDiscriminatorValue[] valueAnns = valuesAnn.value();
if ( valueAnns != null && valueAnns.length > 0 ) {
for ( int i = 0; i < valueAnns.length; i++ ) {
consumer.accept( valueAnns[i] );
for ( AnyDiscriminatorValue ann : valueAnns ) {
consumer.accept(ann);
}
}
}

View File

@ -6,7 +6,6 @@
*/
package org.hibernate.cfg;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
@ -64,7 +63,6 @@ public class CopyIdentifierComponentSecondPass extends FkSecondPass {
}
@Override
@SuppressWarnings({ "unchecked" })
public void doSecondPass(Map persistentClasses) throws MappingException {
PersistentClass referencedPersistentClass = (PersistentClass) persistentClasses.get( referencedEntityName );
// TODO better error names
@ -78,8 +76,6 @@ public class CopyIdentifierComponentSecondPass extends FkSecondPass {
);
}
Component referencedComponent = (Component) referencedPersistentClass.getIdentifier();
Iterator<Property> properties = referencedComponent.getPropertyIterator();
//prepare column name structure
boolean isExplicitReference = true;
@ -101,8 +97,7 @@ public class CopyIdentifierComponentSecondPass extends FkSecondPass {
}
MutableInteger index = new MutableInteger();
while ( properties.hasNext() ) {
Property referencedProperty = properties.next();
for ( Property referencedProperty : referencedComponent.getProperties() ) {
if ( referencedProperty.isComposite() ) {
Property property = createComponentProperty( referencedPersistentClass, isExplicitReference, columnByReferencedName, index, referencedProperty );
component.addProperty( property );
@ -135,10 +130,7 @@ public class CopyIdentifierComponentSecondPass extends FkSecondPass {
value.setComponentClassName( referencedValue.getComponentClassName() );
Iterator<Property> propertyIterator = referencedValue.getPropertyIterator();
while(propertyIterator.hasNext()) {
Property referencedComponentProperty = propertyIterator.next();
for ( Property referencedComponentProperty : referencedValue.getProperties() ) {
if ( referencedComponentProperty.isComposite() ) {
Property componentProperty = createComponentProperty( referencedValue.getOwner(), isExplicitReference, columnByReferencedName, index, referencedComponentProperty );
value.addProperty( componentProperty );
@ -169,19 +161,18 @@ public class CopyIdentifierComponentSecondPass extends FkSecondPass {
property.setValue( value );
final SimpleValue referencedValue = (SimpleValue) referencedProperty.getValue();
value.copyTypeFrom( referencedValue );
final Iterator<Selectable> columns = referencedValue.getColumnIterator();
if ( joinColumns[0].isNameDeferred() ) {
joinColumns[0].copyReferencedStructureAndCreateDefaultJoinColumns(
referencedPersistentClass,
columns,
value);
referencedPersistentClass,
referencedValue,
value
);
}
else {
//FIXME take care of Formula
while ( columns.hasNext() ) {
final Selectable selectable = columns.next();
if ( ! Column.class.isInstance( selectable ) ) {
for ( Selectable selectable : referencedValue.getSelectables() ) {
if ( !(selectable instanceof Column) ) {
log.debug( "Encountered formula definition; skipping" );
continue;
}

View File

@ -18,6 +18,7 @@ import org.hibernate.mapping.Component;
import org.hibernate.mapping.Index;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Selectable;
import org.hibernate.mapping.Table;
import org.hibernate.mapping.UniqueKey;
@ -64,7 +65,7 @@ public class IndexOrUniqueKeySecondPass implements SecondPass {
}
@Override
public void doSecondPass(Map persistentClasses) throws MappingException {
public void doSecondPass(Map<String, PersistentClass> persistentClasses) throws MappingException {
if ( columns != null ) {
for ( String column1 : columns ) {
addConstraintToColumn( column1 );
@ -79,18 +80,18 @@ public class IndexOrUniqueKeySecondPass implements SecondPass {
propertyHolder.getPersistentClass().getEntityName() :
propertyHolder.getEntityName();
final PersistentClass persistentClass = (PersistentClass) persistentClasses.get( entityName );
final PersistentClass persistentClass = persistentClasses.get( entityName );
final Property property = persistentClass.getProperty( column.getPropertyName() );
if ( property.getValue() instanceof Component ) {
final Component component = (Component) property.getValue();
List<Column> columns = new ArrayList<>();
component.getColumnIterator().forEachRemaining( selectable -> {
for ( Selectable selectable: component.getSelectables() ) {
if ( selectable instanceof Column ) {
columns.add( (Column) selectable );
}
} );
}
addConstraintToColumns( columns );
}
else {

View File

@ -27,7 +27,7 @@ import org.hibernate.mapping.ManyToOne;
import org.hibernate.mapping.OneToOne;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Selectable;
import org.hibernate.mapping.SortableValue;
import org.hibernate.type.ForeignKeyDirection;
@ -36,18 +36,18 @@ import org.hibernate.type.ForeignKeyDirection;
* -
*/
public class OneToOneSecondPass implements SecondPass {
private MetadataBuildingContext buildingContext;
private String mappedBy;
private String ownerEntity;
private String ownerProperty;
private PropertyHolder propertyHolder;
private boolean ignoreNotFound;
private PropertyData inferredData;
private XClass targetEntity;
private boolean cascadeOnDelete;
private boolean optional;
private String cascadeStrategy;
private AnnotatedJoinColumn[] joinColumns;
private final MetadataBuildingContext buildingContext;
private final String mappedBy;
private final String ownerEntity;
private final String ownerProperty;
private final PropertyHolder propertyHolder;
private final boolean ignoreNotFound;
private final PropertyData inferredData;
private final XClass targetEntity;
private final boolean cascadeOnDelete;
private final boolean optional;
private final String cascadeStrategy;
private final AnnotatedJoinColumn[] joinColumns;
//that sucks, we should read that from the property mainly
public OneToOneSecondPass(
@ -176,10 +176,10 @@ public class OneToOneSecondPass implements SecondPass {
propertyHolder.addProperty( prop, inferredData.getDeclaringClass() );
}
else if ( otherSideProperty.getValue() instanceof ManyToOne ) {
Iterator it = otherSide.getJoinIterator();
Iterator<Join> it = otherSide.getJoinIterator();
Join otherSideJoin = null;
while ( it.hasNext() ) {
Join otherSideJoinValue = (Join) it.next();
Join otherSideJoinValue = it.next();
if ( otherSideJoinValue.containsProperty( otherSideProperty ) ) {
otherSideJoin = otherSideJoinValue;
break;
@ -200,9 +200,7 @@ public class OneToOneSecondPass implements SecondPass {
manyToOne.setUnwrapProxy( value.isUnwrapProxy() );
manyToOne.markAsLogicalOneToOne();
prop.setValue( manyToOne );
Iterator otherSideJoinKeyColumns = otherSideJoin.getKey().getColumnIterator();
while ( otherSideJoinKeyColumns.hasNext() ) {
Column column = (Column) otherSideJoinKeyColumns.next();
for ( Column column: otherSideJoin.getKey().getColumns() ) {
Column copy = new Column();
copy.setLength( column.getLength() );
copy.setScale( column.getScale() );
@ -287,9 +285,7 @@ public class OneToOneSecondPass implements SecondPass {
//TODO support for inverse and optional
join.setOptional( true ); //perhaps not quite per-spec, but a Good Thing anyway
key.setCascadeDeleteEnabled( false );
Iterator mappedByColumns = otherSideProperty.getValue().getColumnIterator();
while ( mappedByColumns.hasNext() ) {
Column column = (Column) mappedByColumns.next();
for ( Column column: otherSideProperty.getValue().getColumns() ) {
Column copy = new Column();
copy.setLength( column.getLength() );
copy.setScale( column.getScale() );

View File

@ -50,7 +50,7 @@ public class PkDrivenByDefaultMapsIdSecondPass extends FkSecondPass {
}
TableBinder.linkJoinColumnWithValueOverridingNameIfImplicit(
referencedEntity,
referencedEntity.getKey().getColumnIterator(),
referencedEntity.getKey(),
columns,
value);
}

View File

@ -8,6 +8,7 @@ package org.hibernate.cfg;
import java.io.Serializable;
import org.hibernate.MappingException;
import org.hibernate.mapping.PersistentClass;
/**
* Second pass operation
@ -16,7 +17,7 @@ import org.hibernate.MappingException;
*/
public interface SecondPass extends Serializable {
void doSecondPass(java.util.Map persistentClasses)
void doSecondPass(java.util.Map<String, PersistentClass> persistentClasses)
throws MappingException;
}

View File

@ -30,10 +30,10 @@ import org.hibernate.mapping.ToOne;
* @author Emmanuel Bernard
*/
public class ToOneFkSecondPass extends FkSecondPass {
private MetadataBuildingContext buildingContext;
private boolean unique;
private String path;
private String entityClassName;
private final MetadataBuildingContext buildingContext;
private final boolean unique;
private final String path;
private final String entityClassName;
public ToOneFkSecondPass(
ToOne value,
@ -76,9 +76,9 @@ public class ToOneFkSecondPass extends FkSecondPass {
if ( path.startsWith( "id." ) ) {
localPath = path.substring( 3 );
}
Iterator it = ( (Component) valueIdentifier ).getPropertyIterator();
while ( it.hasNext() ) {
Property idProperty = (Property) it.next();
Component component = (Component) valueIdentifier;
for ( Property idProperty : component.getProperties() ) {
if ( localPath.equals( idProperty.getName() ) || localPath.startsWith( idProperty.getName() + "." ) ) {
return true;
}

View File

@ -1352,9 +1352,7 @@ public abstract class CollectionBinder {
private static String buildOrderById(PersistentClass associatedClass, String order) {
final StringBuilder sb = new StringBuilder();
final Iterator<Selectable> columnIterator = associatedClass.getIdentifier().getColumnIterator();
while ( columnIterator.hasNext() ) {
final Selectable selectable = columnIterator.next();
for ( Selectable selectable: associatedClass.getIdentifier().getSelectables() ) {
sb.append( selectable.getText() );
sb.append( order );
sb.append( ", " );
@ -1812,7 +1810,7 @@ public abstract class CollectionBinder {
}
else if ( owner.getIdentifierMapper() != null && owner.getIdentifierMapper().getPropertySpan() > 0 ) {
// use the access for the owning entity's "id mapper", if one
Property prop = owner.getIdentifierMapper().getPropertyIterator().next();
Property prop = owner.getIdentifierMapper().getProperties().get(0);
baseAccessType = prop.getPropertyAccessorName().equals( "property" )
? AccessType.PROPERTY
: AccessType.FIELD;
@ -2016,16 +2014,16 @@ public abstract class CollectionBinder {
final String mappedBy = columns[0].getMappedBy();
if ( StringHelper.isNotEmpty( mappedBy ) ) {
final Property property = referencedEntity.getRecursiveProperty( mappedBy );
Iterator<Selectable> mappedByColumns;
List<Selectable> mappedByColumns;
if ( property.getValue() instanceof Collection ) {
mappedByColumns = ( (Collection) property.getValue() ).getKey().getColumnIterator();
mappedByColumns = ( (Collection) property.getValue() ).getKey().getSelectables();
}
else {
//find the appropriate reference key, can be in a join
Iterator<Join> joinsIt = referencedEntity.getJoinIterator();
KeyValue key = null;
while ( joinsIt.hasNext() ) {
Join join = (Join) joinsIt.next();
Join join = joinsIt.next();
if ( join.containsProperty( property ) ) {
key = join.getKey();
break;
@ -2034,10 +2032,10 @@ public abstract class CollectionBinder {
if ( key == null ) {
key = property.getPersistentClass().getIdentifier();
}
mappedByColumns = key.getColumnIterator();
mappedByColumns = key.getSelectables();
}
while ( mappedByColumns.hasNext() ) {
Column column = (Column) mappedByColumns.next();
for ( Selectable selectable: mappedByColumns ) {
Column column = (Column) selectable;
columns[0].linkValueUsingAColumnCopy( column, value );
}
String referencedPropertyName =

View File

@ -119,11 +119,11 @@ public class MapBinder extends CollectionBinder {
if ( indexValue.getColumnSpan() != 1 ) {
throw new AssertionFailure( "Map key mapped by @MapKeyColumn does not have 1 column" );
}
final Selectable selectable = indexValue.getColumnIterator().next();
final Selectable selectable = indexValue.getSelectables().get(0);
if ( selectable.isFormula() ) {
throw new AssertionFailure( "Map key mapped by @MapKeyColumn is a Formula" );
}
Column column = (Column) map.getIndex().getColumnIterator().next();
Column column = (Column) selectable;
if ( !column.isNullable() ) {
final PersistentClass persistentClass = ( ( OneToMany ) map.getElement() ).getAssociatedClass();
// check if the index column has been mapped by the associated entity to a property;
@ -138,11 +138,10 @@ public class MapBinder extends CollectionBinder {
}
}
private boolean propertyIteratorContainsColumn(Iterator propertyIterator, Column column) {
for ( Iterator it = propertyIterator; it.hasNext(); ) {
final Property property = (Property) it.next();
for ( Iterator<Selectable> selectableIterator = property.getColumnIterator(); selectableIterator.hasNext(); ) {
final Selectable selectable = selectableIterator.next();
private boolean propertyIteratorContainsColumn(Iterator<Property> propertyIterator, Column column) {
for (; propertyIterator.hasNext(); ) {
final Property property = propertyIterator.next();
for ( Selectable selectable: property.getSelectables() ) {
if ( column.equals( selectable ) ) {
final Column iteratedColumn = (Column) selectable;
if ( column.getValue().getTable().equals( iteratedColumn.getValue().getTable() ) ) {
@ -190,7 +189,7 @@ public class MapBinder extends CollectionBinder {
//this is a true Map mapping
//TODO ugly copy/paste from CollectionBinder.bindManyToManySecondPass
String mapKeyType;
Class target = void.class;
Class<?> target = void.class;
/*
* target has priority over reflection for the map key type
* JPA 2 has priority
@ -264,8 +263,9 @@ public class MapBinder extends CollectionBinder {
: AccessType.FIELD;
}
else if ( owner.getIdentifierMapper() != null && owner.getIdentifierMapper().getPropertySpan() > 0 ) {
Property prop = (Property) owner.getIdentifierMapper().getPropertyIterator().next();
accessType = prop.getPropertyAccessorName().equals( "property" ) ? AccessType.PROPERTY
Property prop = owner.getIdentifierMapper().getProperties().get(0);
accessType = prop.getPropertyAccessorName().equals( "property" )
? AccessType.PROPERTY
: AccessType.FIELD;
}
else {
@ -301,7 +301,7 @@ public class MapBinder extends CollectionBinder {
mapValue.setIndex( component );
}
else {
final BasicValueBinder elementBinder = new BasicValueBinder( BasicValueBinder.Kind.MAP_KEY, buildingContext );
final BasicValueBinder<?> elementBinder = new BasicValueBinder<>( BasicValueBinder.Kind.MAP_KEY, buildingContext );
elementBinder.setReturnedClassName( mapKeyType );
AnnotatedColumn[] elementColumns = mapKeyColumns;
@ -423,11 +423,9 @@ public class MapBinder extends CollectionBinder {
if ( value instanceof Component ) {
Component component = (Component) value;
Iterator properties = component.getPropertyIterator();
Component indexComponent = new Component( getBuildingContext(), collection );
indexComponent.setComponentClassName( component.getComponentClassName() );
while ( properties.hasNext() ) {
Property current = (Property) properties.next();
for ( Property current : component.getProperties() ) {
Property newProperty = new Property();
newProperty.setCascade( current.getCascade() );
newProperty.setValueGenerationStrategy( current.getValueGenerationStrategy() );
@ -489,9 +487,7 @@ public class MapBinder extends CollectionBinder {
targetValue = new BasicValue( getBuildingContext(), mapKeyTable );
targetValue.copyTypeFrom( sourceValue );
}
final Iterator<Selectable> columns = sourceValue.getColumnIterator();
while ( columns.hasNext() ) {
Selectable current = columns.next();
for ( Selectable current : sourceValue.getSelectables() ) {
if ( current instanceof Column ) {
targetValue.addColumn( ( (Column) current ).clone() );
}

View File

@ -216,59 +216,59 @@ public class ResultsetMappingSecondPass implements QuerySecondPass {
}
return followers;
}
private Iterator getSubPropertyIterator(PersistentClass pc, String reducedName) {
Value value = pc.getRecursiveProperty( reducedName ).getValue();
Iterator parentPropIter;
if ( value instanceof Component ) {
Component comp = (Component) value;
parentPropIter = comp.getPropertyIterator();
}
else if ( value instanceof ToOne ) {
ToOne toOne = (ToOne) value;
PersistentClass referencedPc = context.getMetadataCollector().getEntityBinding( toOne.getReferencedEntityName() );
if ( toOne.getReferencedPropertyName() != null ) {
try {
parentPropIter = ( (Component) referencedPc.getRecursiveProperty(
toOne.getReferencedPropertyName()
).getValue() ).getPropertyIterator();
}
catch (ClassCastException e) {
throw new MappingException(
"dotted notation references neither a component nor a many/one to one", e
);
}
}
else {
try {
if ( referencedPc.getIdentifierMapper() == null ) {
parentPropIter = ( (Component) referencedPc.getIdentifierProperty()
.getValue() ).getPropertyIterator();
}
else {
parentPropIter = referencedPc.getIdentifierMapper().getPropertyIterator();
}
}
catch (ClassCastException e) {
throw new MappingException(
"dotted notation references neither a component nor a many/one to one", e
);
}
}
}
else {
throw new MappingException( "dotted notation references neither a component nor a many/one to one" );
}
return parentPropIter;
}
private static int getIndexOfFirstMatchingProperty(List propertyNames, String follower) {
int propertySize = propertyNames.size();
for (int propIndex = 0; propIndex < propertySize; propIndex++) {
if ( ( (String) propertyNames.get( propIndex ) ).startsWith( follower ) ) {
return propIndex;
}
}
return -1;
}
//
// private Iterator getSubPropertyIterator(PersistentClass pc, String reducedName) {
// Value value = pc.getRecursiveProperty( reducedName ).getValue();
// Iterator parentPropIter;
// if ( value instanceof Component ) {
// Component comp = (Component) value;
// parentPropIter = comp.getPropertyIterator();
// }
// else if ( value instanceof ToOne ) {
// ToOne toOne = (ToOne) value;
// PersistentClass referencedPc = context.getMetadataCollector().getEntityBinding( toOne.getReferencedEntityName() );
// if ( toOne.getReferencedPropertyName() != null ) {
// try {
// parentPropIter = ( (Component) referencedPc.getRecursiveProperty(
// toOne.getReferencedPropertyName()
// ).getValue() ).getPropertyIterator();
// }
// catch (ClassCastException e) {
// throw new MappingException(
// "dotted notation references neither a component nor a many/one to one", e
// );
// }
// }
// else {
// try {
// if ( referencedPc.getIdentifierMapper() == null ) {
// parentPropIter = ( (Component) referencedPc.getIdentifierProperty()
// .getValue() ).getPropertyIterator();
// }
// else {
// parentPropIter = referencedPc.getIdentifierMapper().getPropertyIterator();
// }
// }
// catch (ClassCastException e) {
// throw new MappingException(
// "dotted notation references neither a component nor a many/one to one", e
// );
// }
// }
// }
// else {
// throw new MappingException( "dotted notation references neither a component nor a many/one to one" );
// }
// return parentPropIter;
// }
//
// private static int getIndexOfFirstMatchingProperty(List propertyNames, String follower) {
// int propertySize = propertyNames.size();
// for (int propIndex = 0; propIndex < propertySize; propIndex++) {
// if ( ( (String) propertyNames.get( propIndex ) ).startsWith( follower ) ) {
// return propIndex;
// }
// }
// return -1;
// }
}

View File

@ -29,6 +29,7 @@ import org.hibernate.cfg.IndexOrUniqueKeySecondPass;
import org.hibernate.cfg.JPAIndexHolder;
import org.hibernate.cfg.ObjectNameSource;
import org.hibernate.cfg.UniqueConstraintHolder;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper;
@ -39,6 +40,7 @@ import org.hibernate.mapping.DependantValue;
import org.hibernate.mapping.JoinedSubclass;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Selectable;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.SortableValue;
import org.hibernate.mapping.Table;
@ -52,7 +54,6 @@ import org.jboss.logging.Logger;
*
* @author Emmanuel Bernard
*/
@SuppressWarnings("unchecked")
public class TableBinder {
//TODO move it to a getter/setter strategy
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, TableBinder.class.getName() );
@ -525,13 +526,6 @@ public class TableBinder {
return table;
}
private static String extract(Identifier identifier) {
if ( identifier == null ) {
return null;
}
return identifier.render();
}
public static void bindFk(
PersistentClass referencedEntity,
PersistentClass destinationEntity,
@ -551,14 +545,14 @@ public class TableBinder {
}
final String mappedByProperty = columns[0].getMappedBy();
if ( StringHelper.isNotEmpty( mappedByProperty ) ) {
/**
/*
* Get the columns of the mapped-by property
* copy them and link the copy to the actual value
*/
LOG.debugf( "Retrieving property %s.%s", associatedClass.getEntityName(), mappedByProperty );
final Property property = associatedClass.getRecursiveProperty( columns[0].getMappedBy() );
Iterator mappedByColumns;
List<Column> mappedByColumns;
if ( property.getValue() instanceof Collection ) {
Collection collection = ( (Collection) property.getValue() );
Value element = collection.getElement();
@ -568,31 +562,25 @@ public class TableBinder {
+ associatedClass.getEntityName() + "." + mappedByProperty
);
}
mappedByColumns = element.getColumnIterator();
mappedByColumns = element.getColumns();
}
else {
mappedByColumns = property.getValue().getColumnIterator();
mappedByColumns = property.getValue().getColumns();
}
while ( mappedByColumns.hasNext() ) {
Column column = (Column) mappedByColumns.next();
for ( Column column: mappedByColumns ) {
columns[0].overrideFromReferencedColumnIfNecessary( column );
columns[0].linkValueUsingAColumnCopy( column, value );
}
}
else if ( columns[0].isImplicit() ) {
/**
/*
* if columns are implicit, then create the columns based on the
* referenced entity id columns
*/
Iterator idColumns;
if ( referencedEntity instanceof JoinedSubclass ) {
idColumns = referencedEntity.getKey().getColumnIterator();
}
else {
idColumns = referencedEntity.getIdentifier().getColumnIterator();
}
while ( idColumns.hasNext() ) {
Column column = (Column) idColumns.next();
List<Column> idColumns = referencedEntity instanceof JoinedSubclass
? referencedEntity.getKey().getColumns()
: referencedEntity.getIdentifier().getColumns();
for ( Column column: idColumns ) {
columns[0].linkValueUsingDefaultColumnNaming( column, referencedEntity, value );
columns[0].overrideFromReferencedColumnIfNecessary( column );
}
@ -635,7 +623,7 @@ public class TableBinder {
);
}
linkJoinColumnWithValueOverridingNameIfImplicit(
referencedEntity, synthProp.getColumnIterator(), columns, value
referencedEntity, synthProp.getValue(), columns, value
);
if ( value instanceof SortableValue ) {
( (SortableValue) value ).sortProperties();
@ -654,7 +642,7 @@ public class TableBinder {
}
linkJoinColumnWithValueOverridingNameIfImplicit(
referencedEntity,
referencedEntity.getIdentifier().getColumnIterator(),
referencedEntity.getIdentifier(),
columns,
value
);
@ -668,25 +656,25 @@ public class TableBinder {
( (Component) referencedEntity.getKey() ).sortProperties();
}
//explicit referencedColumnName
Iterator idColItr = referencedEntity.getKey().getColumnIterator();
Column col;
List<Column> idColumns = referencedEntity.getKey().getColumns();
//works cause the pk has to be on the primary table
Table table = referencedEntity.getTable();
if ( !idColItr.hasNext() ) {
if ( idColumns.isEmpty() ) {
LOG.debug( "No column in the identifier!" );
}
while ( idColItr.hasNext() ) {
for ( Column col: idColumns ) {
boolean match = false;
//for each PK column, find the associated FK column.
col = (Column) idColItr.next();
final String colName = col.getQuotedName( buildingContext.getMetadataCollector().getDatabase().getJdbcEnvironment().getDialect() );
Dialect dialect = buildingContext.getMetadataCollector().getDatabase()
.getJdbcEnvironment().getDialect();
final String colName = col.getQuotedName(dialect);
for (AnnotatedJoinColumn joinCol : columns) {
String referencedColumn = joinCol.getReferencedColumn();
referencedColumn = buildingContext.getMetadataCollector().getPhysicalColumnName(
table,
referencedColumn
);
//In JPA 2 referencedColumnName is case insensitive
//In JPA 2 referencedColumnName is case-insensitive
if ( referencedColumn.equalsIgnoreCase( colName ) ) {
//proper join column
if ( joinCol.isNameDeferred() ) {
@ -718,15 +706,16 @@ public class TableBinder {
}
value.createForeignKey();
if ( unique ) {
createUniqueConstraint( value );
value.createUniqueKey();
}
}
public static void linkJoinColumnWithValueOverridingNameIfImplicit(
PersistentClass referencedEntity,
Iterator columnIterator,
Value v,
AnnotatedJoinColumn[] columns,
SimpleValue value) {
Iterator<Selectable> columnIterator = v.getColumnIterator();
for (AnnotatedJoinColumn joinCol : columns) {
Column synthCol = (Column) columnIterator.next();
if ( joinCol.isNameDeferred() ) {
@ -740,15 +729,6 @@ public class TableBinder {
}
}
public static void createUniqueConstraint(Value value) {
Iterator iter = value.getColumnIterator();
ArrayList cols = new ArrayList();
while ( iter.hasNext() ) {
cols.add( iter.next() );
}
value.getTable().createUniqueKey( cols );
}
public static void addIndexes(Table hibTable, Index[] indexes, MetadataBuildingContext buildingContext) {
for (Index index : indexes) {
//no need to handle inSecondPass here since it is only called from EntityBinder

View File

@ -10,7 +10,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -280,9 +279,7 @@ class TypeSafeActivator {
ConstraintDescriptor<Min> minConstraint = (ConstraintDescriptor<Min>) descriptor;
long min = minConstraint.getAnnotation().value();
final Iterator<Selectable> itor = property.getColumnIterator();
if ( itor.hasNext() ) {
final Selectable selectable = itor.next();
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable instanceof Column ) {
Column col = (Column) selectable;
String checkConstraint = col.getQuotedName(dialect) + ">=" + min;
@ -298,9 +295,7 @@ class TypeSafeActivator {
ConstraintDescriptor<Max> maxConstraint = (ConstraintDescriptor<Max>) descriptor;
long max = maxConstraint.getAnnotation().value();
final Iterator<Selectable> itor = property.getColumnIterator();
if ( itor.hasNext() ) {
final Selectable selectable = itor.next();
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable instanceof Column ) {
Column col = (Column) selectable;
String checkConstraint = col.getQuotedName( dialect ) + "<=" + max;
@ -327,9 +322,7 @@ class TypeSafeActivator {
if ( !( property.getPersistentClass() instanceof SingleTableSubclass ) ) {
//composite should not add not-null on all columns
if ( !property.isComposite() ) {
final Iterator<Selectable> itr = property.getColumnIterator();
while ( itr.hasNext() ) {
final Selectable selectable = itr.next();
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable instanceof Column ) {
((Column) selectable).setNullable( false );
}
@ -356,9 +349,7 @@ class TypeSafeActivator {
int integerDigits = digitsConstraint.getAnnotation().integer();
int fractionalDigits = digitsConstraint.getAnnotation().fraction();
final Iterator<Selectable> itor = property.getColumnIterator();
if ( itor.hasNext() ) {
final Selectable selectable = itor.next();
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable instanceof Column ) {
Column col = (Column) selectable;
col.setPrecision( integerDigits + fractionalDigits );
@ -376,10 +367,7 @@ class TypeSafeActivator {
ConstraintDescriptor<Size> sizeConstraint = (ConstraintDescriptor<Size>) descriptor;
int max = sizeConstraint.getAnnotation().max();
final Iterator<Selectable> itor = property.getColumnIterator();
if ( itor.hasNext() ) {
final Selectable selectable = itor.next();
Column col = (Column) selectable;
for ( Column col : property.getColumns() ) {
if ( max < Integer.MAX_VALUE ) {
col.setLength( max );
}
@ -394,9 +382,7 @@ class TypeSafeActivator {
&& String.class.equals( propertyDescriptor.getElementClass() ) ) {
int max = (Integer) descriptor.getAttributes().get( "max" );
final Iterator<Selectable> itor = property.getColumnIterator();
if ( itor.hasNext() ) {
final Selectable selectable = itor.next();
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable instanceof Column ) {
Column col = (Column) selectable;
if ( max < Integer.MAX_VALUE ) {

View File

@ -28,9 +28,7 @@ public class NullableDiscriminatorColumnSecondPass implements SecondPass {
public void doSecondPass(Map persistentClasses) throws MappingException {
PersistentClass rootPersistenceClass = (PersistentClass) persistentClasses.get( rootEntityName );
if ( hasNullDiscriminatorValue( rootPersistenceClass ) ) {
for ( Iterator<Selectable> iterator = rootPersistenceClass.getDiscriminator().getColumnIterator();
iterator.hasNext(); ) {
Selectable selectable = iterator.next();
for ( Selectable selectable: rootPersistenceClass.getDiscriminator().getSelectables() ) {
if ( selectable instanceof Column ) {
( (Column) selectable ).setNullable( true );
}
@ -38,7 +36,6 @@ public class NullableDiscriminatorColumnSecondPass implements SecondPass {
}
}
@SuppressWarnings({ "unchecked" })
private boolean hasNullDiscriminatorValue(PersistentClass rootPersistenceClass) {
if ( rootPersistenceClass.isDiscriminatorValueNull() ) {
return true;

View File

@ -125,12 +125,10 @@ public class TemporaryTable implements Exportable, Contributable {
final PersistentClass entityBinding = runtimeModelCreationContext.getBootModel()
.getEntityBinding( entityDescriptor.getEntityName() );
final Iterator<Selectable> itr = entityBinding.getKey().getColumnIterator();
final Iterator<JdbcMapping> jdbcMappings = entityDescriptor.getIdentifierMapping()
.getJdbcMappings()
.iterator();
while ( itr.hasNext() ) {
final Column column = (Column) itr.next();
for ( Column column : entityBinding.getKey().getColumns() ) {
final JdbcMapping jdbcMapping = jdbcMappings.next();
columns.add(
new TemporaryTableColumn(
@ -155,8 +153,8 @@ public class TemporaryTable implements Exportable, Contributable {
if ( !( fkTarget instanceof EntityIdentifierMapping ) ) {
final Value value = entityBinding.getSubclassProperty( pluralAttribute.getAttributeName() )
.getValue();
final Iterator<Selectable> columnIterator = ( (Collection) value ).getKey()
.getColumnIterator();
final Iterator<Selectable> columnIterator =
( (Collection) value ).getKey().getColumnIterator();
fkTarget.forEachSelectable(
(columnIndex, selection) -> {
final Selectable selectable = columnIterator.next();
@ -207,12 +205,10 @@ public class TemporaryTable implements Exportable, Contributable {
final boolean hasOptimizer;
if ( identityColumn ) {
hasOptimizer = false;
final Iterator<Selectable> itr = entityBinding.getKey().getColumnIterator();
final Iterator<JdbcMapping> jdbcMappings = entityDescriptor.getIdentifierMapping()
.getJdbcMappings()
.iterator();
while ( itr.hasNext() ) {
final Column column = (Column) itr.next();
for ( Column column : entityBinding.getKey().getColumns() ) {
final JdbcMapping jdbcMapping = jdbcMappings.next();
columns.add(
new TemporaryTableColumn(
@ -237,12 +233,10 @@ public class TemporaryTable implements Exportable, Contributable {
hasOptimizer = false;
}
}
final Iterator<Selectable> itr = entityBinding.getKey().getColumnIterator();
final Iterator<JdbcMapping> jdbcMappings = entityDescriptor.getIdentifierMapping()
.getJdbcMappings()
.iterator();
while ( itr.hasNext() ) {
final Column column = (Column) itr.next();
for ( Column column : entityBinding.getKey().getColumns() ) {
final JdbcMapping jdbcMapping = jdbcMappings.next();
columns.add(
new TemporaryTableColumn(
@ -259,7 +253,7 @@ public class TemporaryTable implements Exportable, Contributable {
final EntityDiscriminatorMapping discriminatorMapping = entityDescriptor.getDiscriminatorMapping();
if ( entityBinding.getDiscriminator() != null && !discriminatorMapping.isFormula() ) {
final Column discriminator = (Column) entityBinding.getDiscriminator().getColumnIterator().next();
final Column discriminator = entityBinding.getDiscriminator().getColumns().get(0);
columns.add(
new TemporaryTableColumn(
temporaryTable,

View File

@ -6,7 +6,6 @@
*/
package org.hibernate.id;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
@ -69,14 +68,19 @@ public class ExportableColumn extends Column {
return 1;
}
@Override
@Override @Deprecated
public Iterator<Selectable> getColumnIterator() {
return new ColumnIterator( column );
}
@Override
public List<Selectable> getSelectables() {
return Arrays.asList( column );
return List.of( column );
}
@Override
public List<Column> getColumns() {
return List.of( column );
}
@Override
@ -130,7 +134,11 @@ public class ExportableColumn extends Column {
}
@Override
public void createForeignKey() throws MappingException {
public void createForeignKey() {
}
@Override
public void createUniqueKey() {
}
@Override

View File

@ -30,6 +30,7 @@ public class JoinedIterator<T> implements Iterator<T> {
this( wrappedIterators.toArray(new Iterator[0]) );
}
@SafeVarargs
public JoinedIterator(Iterator<? extends T>... iteratorsToWrap) {
if( iteratorsToWrap == null ) {
throw new NullPointerException( "Iterators to join were null" );

View File

@ -0,0 +1,51 @@
/*
* 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.internal.util.collections;
import java.util.AbstractList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @author Gavin King
*/
public class JoinedList<E> extends AbstractList<E> {
private final List<List<E>> lists;
private final int size;
public JoinedList(List<List<E>> lists) {
this.lists = lists;
size = lists.stream().map(List::size).reduce(0, Integer::sum);
}
@SafeVarargs
public JoinedList(List<E>... lists) {
this( Arrays.asList(lists) );
}
@Override
public E get(int index) {
for (List<E> list: lists) {
if ( list.size() > index ) {
return list.get(index);
}
index -= list.size();
}
return null;
}
@Override
public int size() {
return size;
}
@Override
public Iterator<E> iterator() {
return lists.stream().flatMap(List::stream).iterator();
}
}

View File

@ -47,7 +47,7 @@ public abstract class Collection implements Fetchable, Value, Filterable {
public static final String DEFAULT_KEY_COLUMN_NAME = "id";
private final MetadataBuildingContext buildingContext;
private PersistentClass owner;
private final PersistentClass owner;
private KeyValue key;
private Value element;
@ -346,14 +346,12 @@ public abstract class Collection implements Fetchable, Value, Filterable {
throws MappingException {
final boolean[] insertability = value.getColumnInsertability();
final boolean[] updatability = value.getColumnUpdateability();
final Iterator<Selectable> iterator = value.getColumnIterator();
int i = 0;
while ( iterator.hasNext() ) {
Selectable s = iterator.next();
for ( Selectable selectable : value.getSelectables() ) {
// exclude formulas and columns that are not insertable or updatable
// since these values can be repeated (HHH-5393)
if ( !s.isFormula() && ( insertability[i] || updatability[i] ) ) {
Column col = (Column) s;
if ( !selectable.isFormula() && ( insertability[i] || updatability[i] ) ) {
Column col = (Column) selectable;
if ( !distinctColumns.add( col.getName() ) ) {
throw new MappingException(
"Repeated column in mapping for collection: "
@ -387,6 +385,7 @@ public abstract class Collection implements Fetchable, Value, Filterable {
}
}
@Deprecated
public Iterator<Selectable> getColumnIterator() {
return Collections.emptyIterator();
}
@ -396,6 +395,11 @@ public abstract class Collection implements Fetchable, Value, Filterable {
return Collections.emptyList();
}
@Override
public List<Column> getColumns() {
return Collections.emptyList();
}
public int getColumnSpan() {
return 0;
}
@ -404,8 +408,7 @@ public abstract class Collection implements Fetchable, Value, Filterable {
return getCollectionType();
}
@SuppressWarnings("rawtypes")
public CollectionSemantics getCollectionSemantics() {
public CollectionSemantics<?,?> getCollectionSemantics() {
if ( cachedCollectionSemantics == null ) {
cachedCollectionSemantics = resolveCollectionSemantics();
}
@ -475,6 +478,10 @@ public abstract class Collection implements Fetchable, Value, Filterable {
public void createForeignKey() {
}
@Override
public void createUniqueKey() {
}
public boolean isSimpleValue() {
return false;
}

View File

@ -12,6 +12,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.hibernate.MappingException;
import org.hibernate.boot.model.relational.Database;
@ -41,7 +42,7 @@ import org.hibernate.type.Type;
* @author Steve Ebersole
*/
public class Component extends SimpleValue implements MetaAttributable, SortableValue {
private ArrayList<Property> properties = new ArrayList<>();
private final ArrayList<Property> properties = new ArrayList<>();
private int[] originalPropertyOrder = ArrayHelper.EMPTY_INT_ARRAY;
private String componentClassName;
private boolean embedded;
@ -88,6 +89,10 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
return properties.iterator();
}
public List<Property> getProperties() {
return properties;
}
public void addProperty(Property p) {
properties.add( p );
}
@ -100,37 +105,35 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
@Override
public int getColumnSpan() {
int n=0;
Iterator iter = getPropertyIterator();
while ( iter.hasNext() ) {
Property p = (Property) iter.next();
n+= p.getColumnSpan();
for ( Property property : getProperties() ) {
n += property.getColumnSpan();
}
return n;
}
@Override
@SuppressWarnings("unchecked")
@Override @Deprecated
public Iterator<Selectable> getColumnIterator() {
@SuppressWarnings("unchecked")
Iterator<Selectable>[] iters = new Iterator[ getPropertySpan() ];
Iterator<Property> iter = getPropertyIterator();
int i = 0;
while ( iter.hasNext() ) {
iters[i++] = iter.next().getColumnIterator();
for ( Property property : getProperties() ) {
iters[i++] = property.getColumnIterator();
}
return new JoinedIterator<>( iters );
}
@Override
public List<Selectable> getSelectables() {
final List<Selectable> columns = new ArrayList<>();
final Iterator<Property> propertyIterator = getPropertyIterator();
while ( propertyIterator.hasNext() ) {
final Iterator<Selectable> columnIterator = propertyIterator.next().getColumnIterator();
while ( columnIterator.hasNext() ) {
columns.add( columnIterator.next() );
}
}
return columns;
return properties.stream()
.flatMap( p -> p.getSelectables().stream() )
.collect(Collectors.toList());
}
@Override
public List<Column> getColumns() {
return properties.stream()
.flatMap( p -> p.getValue().getColumns().stream() )
.collect(Collectors.toList());
}
public boolean isEmbedded() {
@ -141,7 +144,7 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
return componentClassName;
}
public Class getComponentClass() throws MappingException {
public Class<?> getComponentClass() throws MappingException {
final ClassLoaderService classLoaderService = getMetadata()
.getMetadataBuildingOptions()
.getServiceRegistry()
@ -256,10 +259,8 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
@Override
public boolean[] getColumnInsertability() {
boolean[] result = new boolean[ getColumnSpan() ];
Iterator iter = getPropertyIterator();
int i=0;
while ( iter.hasNext() ) {
Property prop = (Property) iter.next();
for ( Property prop : getProperties() ) {
boolean[] chunk = prop.getValue().getColumnInsertability();
if ( prop.isInsertable() ) {
System.arraycopy(chunk, 0, result, i, chunk.length);
@ -284,10 +285,8 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
@Override
public boolean[] getColumnUpdateability() {
boolean[] result = new boolean[ getColumnSpan() ];
Iterator iter = getPropertyIterator();
int i=0;
while ( iter.hasNext() ) {
Property prop = (Property) iter.next();
for ( Property prop : getProperties() ) {
boolean[] chunk = prop.getValue().getColumnUpdateability();
if ( prop.isUpdateable() ) {
System.arraycopy(chunk, 0, result, i, chunk.length);
@ -334,9 +333,7 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
}
public Property getProperty(String propertyName) throws MappingException {
Iterator iter = getPropertyIterator();
while ( iter.hasNext() ) {
Property prop = (Property) iter.next();
for ( Property prop : getProperties() ) {
if ( prop.getName().equals(propertyName) ) {
return prop;
}
@ -391,8 +388,8 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
);
}
final Class entityClass = rootClass.getMappedClass();
final Class attributeDeclarer; // what class is the declarer of the composite pk attributes
final Class<?> entityClass = rootClass.getMappedClass();
final Class<?> attributeDeclarer; // what class is the declarer of the composite pk attributes
CompositeNestedGeneratedValueGenerator.GenerationContextLocator locator;
// IMPL NOTE : See the javadoc discussion on CompositeNestedGeneratedValueGenerator wrt the
@ -413,9 +410,7 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
locator = new StandardGenerationContextLocator( rootClass.getEntityName() );
final CompositeNestedGeneratedValueGenerator generator = new CompositeNestedGeneratedValueGenerator( locator );
Iterator itr = getPropertyIterator();
while ( itr.hasNext() ) {
final Property property = (Property) itr.next();
for ( Property property : getProperties() ) {
if ( property.getValue().isSimpleValue() ) {
final SimpleValue value = (SimpleValue) property.getValue();
@ -443,13 +438,13 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
return generator;
}
private Setter injector(Property property, Class attributeDeclarer) {
private Setter injector(Property property, Class<?> attributeDeclarer) {
return property.getPropertyAccessStrategy( attributeDeclarer )
.buildPropertyAccess( attributeDeclarer, property.getName(), true )
.getSetter();
}
private Class resolveComponentClass() {
private Class<?> resolveComponentClass() {
try {
return getComponentClass();
}
@ -543,9 +538,7 @@ public class Component extends SimpleValue implements MetaAttributable, Sortable
final List<Column> columns = primaryKey.getColumns();
columns.clear();
for ( int i = 0; i < properties.size(); i++ ) {
final Iterator<Selectable> columnIterator = properties.get( i ).getColumnIterator();
while ( columnIterator.hasNext() ) {
final Selectable selectable = columnIterator.next();
for ( Selectable selectable : properties.get(i).getSelectables() ) {
if ( selectable instanceof Column ) {
columns.add( (Column) selectable );
}

View File

@ -17,6 +17,7 @@ import java.util.List;
import java.util.Locale;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.boot.model.relational.Exportable;
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
import org.hibernate.dialect.Dialect;
@ -129,11 +130,13 @@ public abstract class Constraint implements RelationalModel, Exportable, Seriali
}
}
public void addColumns(Iterator columnIterator) {
while ( columnIterator.hasNext() ) {
Selectable col = (Selectable) columnIterator.next();
if ( !col.isFormula() ) {
addColumn( (Column) col );
public void addColumns(Value value) {
for ( Selectable selectable : value.getSelectables() ) {
if ( selectable.isFormula() ) {
throw new MappingException( "constraint involves a formula: " + this.name );
}
else {
addColumn( (Column) selectable );
}
}
}

View File

@ -7,7 +7,9 @@
package org.hibernate.mapping;
/**
* Part of the mapping model that is associated with a contributor. ORM, Envers, Search, etc
* Part of the mapping model that is associated with a contributor.
* ORM, Envers, Search, etc
*
* @author Steve Ebersole
*/
public interface Contributable {

View File

@ -7,17 +7,18 @@
package org.hibernate.mapping;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.collections.JoinedList;
/**
* @author Gavin King
*/
@SuppressWarnings("unchecked")
public class DenormalizedTable extends Table {
private final Table includedTable;
@ -59,9 +60,9 @@ public class DenormalizedTable extends Table {
@Override
public void createForeignKeys() {
includedTable.createForeignKeys();
Iterator iter = includedTable.getForeignKeyIterator();
Iterator<ForeignKey> iter = includedTable.getForeignKeyIterator();
while ( iter.hasNext() ) {
ForeignKey fk = (ForeignKey) iter.next();
ForeignKey fk = iter.next();
createForeignKey(
Constraint.generateName(
fk.generatedConstraintNamePrefix(),
@ -79,29 +80,27 @@ public class DenormalizedTable extends Table {
@Override
public Column getColumn(Column column) {
Column superColumn = super.getColumn( column );
if ( superColumn != null ) {
return superColumn;
}
else {
return includedTable.getColumn( column );
}
return superColumn != null ? superColumn : includedTable.getColumn(column);
}
public Column getColumn(Identifier name) {
Column superColumn = super.getColumn( name );
if ( superColumn != null ) {
return superColumn;
}
else {
return includedTable.getColumn( name );
}
return superColumn != null ? superColumn : includedTable.getColumn(name);
}
@Override @Deprecated
public Iterator<Column> getColumnIterator() {
return new JoinedIterator<>(
includedTable.getColumnIterator(),
super.getColumnIterator()
);
}
@Override
public Iterator getColumnIterator() {
return new JoinedIterator(
includedTable.getColumnIterator(),
super.getColumnIterator()
public Collection<Column> getColumns() {
return new JoinedList<>(
new ArrayList<>( includedTable.getColumns() ),
new ArrayList<>( super.getColumns() )
);
}
@ -116,11 +115,11 @@ public class DenormalizedTable extends Table {
}
@Override
public Iterator getUniqueKeyIterator() {
public Iterator<UniqueKey> getUniqueKeyIterator() {
if ( !includedTable.isPhysicalTable() ) {
Iterator iter = includedTable.getUniqueKeyIterator();
Iterator<UniqueKey> iter = includedTable.getUniqueKeyIterator();
while ( iter.hasNext() ) {
UniqueKey uk = (UniqueKey) iter.next();
UniqueKey uk = iter.next();
createUniqueKey( uk.getColumns() );
}
}
@ -128,18 +127,18 @@ public class DenormalizedTable extends Table {
}
@Override
public Iterator getIndexIterator() {
List indexes = new ArrayList();
Iterator iter = includedTable.getIndexIterator();
public Iterator<Index> getIndexIterator() {
List<Index> indexes = new ArrayList<>();
Iterator<Index> iter = includedTable.getIndexIterator();
while ( iter.hasNext() ) {
Index parentIndex = (Index) iter.next();
Index parentIndex = iter.next();
Index index = new Index();
index.setName( getName() + parentIndex.getName() );
index.setTable( this );
index.addColumns( parentIndex.getColumnIterator() );
indexes.add( index );
}
return new JoinedIterator(
return new JoinedIterator<>(
indexes.iterator(),
super.getIndexIterator()
);

View File

@ -14,8 +14,8 @@ import org.hibernate.boot.spi.MetadataBuildingContext;
public class DependantBasicValue extends BasicValue {
private final BasicValue referencedValue;
private boolean nullable;
private boolean updateable;
private final boolean nullable;
private final boolean updateable;
public DependantBasicValue(
MetadataBuildingContext buildingContext,

View File

@ -20,7 +20,7 @@ import java.util.LinkedHashSet;
public class FetchProfile {
private final String name;
private final MetadataSource source;
private LinkedHashSet<Fetch> fetches = new LinkedHashSet<>();
private final LinkedHashSet<Fetch> fetches = new LinkedHashSet<>();
/**
* Create a fetch profile representation.

View File

@ -9,6 +9,7 @@ import org.hibernate.FetchMode;
/**
* Any mapping with an outer-join attribute
*
* @author Gavin King
*/
public interface Fetchable {

View File

@ -25,7 +25,7 @@ public class ForeignKey extends Constraint {
private String referencedEntityName;
private String keyDefinition;
private boolean cascadeDeleteEnabled;
private List<Column> referencedColumns = new ArrayList<>();
private final List<Column> referencedColumns = new ArrayList<>();
private boolean creationEnabled = true;
public ForeignKey() {
@ -73,10 +73,10 @@ public class ForeignKey extends Constraint {
referencedColumnItr = referencedColumns.iterator();
}
Iterator columnItr = getColumnIterator();
Iterator<Column> columnItr = getColumnIterator();
int i = 0;
while ( columnItr.hasNext() ) {
columnNames[i] = ( (Column) columnItr.next() ).getQuotedName( dialect );
columnNames[i] = columnItr.next().getQuotedName( dialect );
referencedColumnNames[i] = referencedColumnItr.next().getQuotedName( dialect );
i++;
}
@ -105,9 +105,9 @@ public class ForeignKey extends Constraint {
return referencedTable;
}
private void appendColumns(StringBuilder buf, Iterator columns) {
private void appendColumns(StringBuilder buf, Iterator<Column> columns) {
while ( columns.hasNext() ) {
Column column = (Column) columns.next();
Column column = columns.next();
buf.append( column.getName() );
if ( columns.hasNext() ) {
buf.append( "," );
@ -149,10 +149,10 @@ public class ForeignKey extends Constraint {
throw new MappingException( sb.toString() );
}
Iterator fkCols = getColumnIterator();
Iterator pkCols = referencedTable.getPrimaryKey().getColumnIterator();
Iterator<Column> fkCols = getColumnIterator();
Iterator<Column> pkCols = referencedTable.getPrimaryKey().getColumnIterator();
while ( pkCols.hasNext() ) {
( (Column) fkCols.next() ).setLength( ( (Column) pkCols.next() ).getLength() );
fkCols.next().setLength( pkCols.next().getLength() );
}
}
@ -207,7 +207,7 @@ public class ForeignKey extends Constraint {
/**
* Returns the referenced columns if the foreignkey does not refer to the primary key
*/
public List getReferencedColumns() {
public List<Column> getReferencedColumns() {
return referencedColumns;
}
@ -218,9 +218,9 @@ public class ForeignKey extends Constraint {
return referencedColumns.isEmpty();
}
public void addReferencedColumns(Iterator referencedColumnsIterator) {
public void addReferencedColumns(Iterator<Column> referencedColumnsIterator) {
while ( referencedColumnsIterator.hasNext() ) {
Selectable col = (Selectable) referencedColumnsIterator.next();
Selectable col = referencedColumnsIterator.next();
if ( !col.isFormula() ) {
addReferencedColumn( (Column) col );
}

View File

@ -55,7 +55,7 @@ public abstract class IdentifierCollection extends Collection {
void createPrimaryKey() {
if ( !isOneToMany() ) {
PrimaryKey pk = new PrimaryKey( getCollectionTable() );
pk.addColumns( getIdentifier().getColumnIterator() );
pk.addColumns( getIdentifier() );
getCollectionTable().setPrimaryKey(pk);
}
// create an index on the key columns??

View File

@ -58,23 +58,21 @@ public abstract class IndexedCollection extends Collection {
void createPrimaryKey() {
if ( !isOneToMany() ) {
PrimaryKey pk = new PrimaryKey( getCollectionTable() );
pk.addColumns( getKey().getColumnIterator() );
pk.addColumns( getKey() );
// index should be last column listed
boolean indexIsPartOfElement = false;
final Iterator<Selectable> iter = getIndex().getColumnIterator();
while ( iter.hasNext() ) {
final Selectable selectable = iter.next();
for ( Selectable selectable: getIndex().getSelectables() ) {
if ( selectable.isFormula() || !getCollectionTable().containsColumn( (Column) selectable ) ) {
indexIsPartOfElement = true;
}
}
if ( indexIsPartOfElement ) {
//if it is part of the element, use the element columns in the PK
pk.addColumns( getElement().getColumnIterator() );
pk.addColumns( getElement() );
}
else {
pk.addColumns( getIndex().getColumnIterator() );
pk.addColumns( getIndex() );
}
getCollectionTable().setPrimaryKey(pk);
}

View File

@ -9,6 +9,7 @@ package org.hibernate.mapping;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle;
import org.hibernate.sql.Alias;
@ -52,6 +53,15 @@ public class Join implements AttributeContainer, Serializable {
prop.setPersistentClass( getPersistentClass() );
}
public List<Property> getDeclaredProperties() {
return declaredProperties;
}
public List<Property> getProperties() {
return properties;
}
@Deprecated(since = "6.0")
public Iterator<Property> getDeclaredPropertyIterator() {
return declaredProperties.iterator();
}
@ -59,6 +69,8 @@ public class Join implements AttributeContainer, Serializable {
public boolean containsProperty(Property prop) {
return properties.contains(prop);
}
@Deprecated(since = "6.0")
public Iterator<Property> getPropertyIterator() {
return properties.iterator();
}
@ -95,7 +107,7 @@ public class Join implements AttributeContainer, Serializable {
pk.setName( PK_ALIAS.toAliasString( table.getName() ) );
table.setPrimaryKey(pk);
pk.addColumns( getKey().getColumnIterator() );
pk.addColumns( getKey() );
}
public int getPropertySpan() {

View File

@ -6,6 +6,7 @@
*/
package org.hibernate.mapping;
import java.util.Iterator;
import java.util.List;
import org.hibernate.MappingException;
import org.hibernate.boot.spi.MetadataBuildingContext;
@ -52,10 +53,15 @@ public class JoinedSubclass extends Subclass implements TableOwner {
}
}
@Deprecated
public Iterator<Property> getReferenceablePropertyIterator() {
return getPropertyIterator();
}
public List<Property> getReferenceableProperties() {
return getProperties();
}
public Object accept(PersistentClassVisitor mv) {
return mv.accept(this);
}

View File

@ -48,16 +48,21 @@ public class ManyToOne extends ToOne {
return resolvedType;
}
public void createForeignKey() throws MappingException {
public void createForeignKey() {
// Ensure properties are sorted before we create a foreign key
sortProperties();
// the case of a foreign key to something other than the pk is handled in createPropertyRefConstraints
if (referencedPropertyName==null && !hasFormula() ) {
if ( referencedPropertyName==null && !hasFormula() ) {
createForeignKeyOfEntity( ( (EntityType) getType() ).getAssociatedEntityName() );
}
}
@Override
public void createUniqueKey() {
if ( !hasFormula() ) {
getTable().createUniqueKey( getConstraintColumns() );
}
}
public void createPropertyRefConstraints(Map persistentClasses) {
if (referencedPropertyName!=null) {
@ -82,19 +87,12 @@ public class ManyToOne extends ToOne {
}
// todo : if "none" another option is to create the ForeignKey object still but to set its #disableCreation flag
if ( !hasFormula() && !"none".equals( getForeignKeyName() ) ) {
java.util.List refColumns = new ArrayList();
Iterator iter = property.getColumnIterator();
while ( iter.hasNext() ) {
Column col = (Column) iter.next();
refColumns.add( col );
}
ForeignKey fk = getTable().createForeignKey(
getForeignKeyName(),
getConstraintColumns(),
( (EntityType) getType() ).getAssociatedEntityName(),
getForeignKeyDefinition(),
refColumns
getForeignKeyDefinition(),
new ArrayList<>( property.getColumns() )
);
fk.setCascadeDeleteEnabled(isCascadeDeleteEnabled() );
}

View File

@ -33,7 +33,7 @@ public class OneToMany implements Value {
public OneToMany(MetadataBuildingContext buildingContext, PersistentClass owner) throws MappingException {
this.buildingContext = buildingContext;
this.referencingTable = ( owner == null ) ? null : owner.getTable();
this.referencingTable = owner == null ? null : owner.getTable();
}
public MetadataBuildingContext getBuildingContext() {
@ -74,6 +74,11 @@ public class OneToMany implements Value {
// no foreign key element for a one-to-many
}
@Override
public void createUniqueKey() {
}
@Deprecated
public Iterator<Selectable> getColumnIterator() {
return associatedClass.getKey().getColumnIterator();
}
@ -83,6 +88,11 @@ public class OneToMany implements Value {
return associatedClass.getKey().getSelectables();
}
@Override
public List<Column> getColumns() {
return associatedClass.getKey().getColumns();
}
public int getColumnSpan() {
return associatedClass.getKey().getColumnSpan();
}
@ -150,8 +160,8 @@ public class OneToMany implements Value {
public boolean isSame(OneToMany other) {
return Objects.equals( referencingTable, other.referencingTable )
&& Objects.equals( referencedEntityName, other.referencedEntityName )
&& Objects.equals( associatedClass, other.associatedClass );
&& Objects.equals( referencedEntityName, other.referencedEntityName )
&& Objects.equals( associatedClass, other.associatedClass );
}
public boolean[] getColumnInsertability() {

View File

@ -6,14 +6,12 @@
*/
package org.hibernate.mapping;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import org.hibernate.MappingException;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.type.EntityType;
import org.hibernate.type.ForeignKeyDirection;
import org.hibernate.type.Type;
@ -28,7 +26,7 @@ public class OneToOne extends ToOne {
private ForeignKeyDirection foreignKeyType;
private KeyValue identifier;
private String propertyName;
private String entityName;
private final String entityName;
private String mappedByProperty;
public OneToOne(MetadataBuildingContext buildingContext, Table table, PersistentClass owner) throws MappingException {
@ -48,13 +46,9 @@ public class OneToOne extends ToOne {
public String getEntityName() {
return entityName;
}
public void setEntityName(String propertyName) {
this.entityName = entityName==null ? null : entityName.intern();
}
public Type getType() throws MappingException {
if ( getColumnIterator().hasNext() ) {
if ( getColumnSpan()>0 ) {
return MappingHelper.specialOneToOne(
getReferencedEntityName(),
getForeignKeyType(),
@ -95,20 +89,27 @@ public class OneToOne extends ToOne {
}
@Override
public List<Selectable> getSelectables() {
if ( super.getSelectables().size() > 0 ) {
return super.getSelectables();
public void createUniqueKey() {
if ( !hasFormula() && getColumnSpan()>0 ) {
getTable().createUniqueKey( getConstraintColumns() );
}
return getConstraintColumns();
}
public List getConstraintColumns() {
ArrayList list = new ArrayList();
Iterator iter = identifier.getColumnIterator();
while ( iter.hasNext() ) {
list.add( iter.next() );
@Override
public List<Selectable> getVirtualSelectables() {
List<Selectable> selectables = super.getVirtualSelectables();
if ( selectables.isEmpty() ) {
selectables = identifier.getSelectables();
}
return list;
return selectables;
}
public List<Column> getConstraintColumns() {
List<Column> columns = super.getColumns();
if ( columns.isEmpty() ) {
columns = identifier.getColumns();
}
return columns;
}
@Override

View File

@ -12,6 +12,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
@ -25,6 +26,7 @@ import org.hibernate.engine.spi.Mapping;
import org.hibernate.internal.FilterConfiguration;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.collections.JoinedList;
import org.hibernate.internal.util.collections.SingletonIterator;
import org.hibernate.metamodel.RepresentationMode;
import org.hibernate.persister.entity.EntityPersister;
@ -58,8 +60,8 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
private String discriminatorValue;
private boolean lazy;
private java.util.List<Property> properties = new ArrayList<>();
private java.util.List<Property> declaredProperties = new ArrayList<>();
private final java.util.List<Property> properties = new ArrayList<>();
private final java.util.List<Property> declaredProperties = new ArrayList<>();
private final java.util.List<Subclass> subclasses = new ArrayList<>();
private final java.util.List<Property> subclassProperties = new ArrayList<>();
private final java.util.List<Table> subclassTables = new ArrayList<>();
@ -68,7 +70,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
private int batchSize = -1;
private boolean selectBeforeUpdate;
private java.util.Map metaAttributes;
private java.util.List<Join> joins = new ArrayList<>();
private final java.util.List<Join> joins = new ArrayList<>();
private final java.util.List<Join> subclassJoins = new ArrayList<>();
private final java.util.List<FilterConfiguration> filters = new ArrayList<>();
protected final Set<String> synchronizedTables = new HashSet<>();
@ -89,8 +91,6 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
private boolean customDeleteCallable;
private ExecuteUpdateResultCheckStyle deleteCheckStyle;
private java.util.Map tuplizerImpls;
private MappedSuperclass superMappedSuperclass;
private Component declaredIdentifierMapper;
private OptimisticLockStyle optimisticLockStyle;
@ -218,6 +218,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
* first.
*/
public Iterator<Subclass> getSubclassIterator() {
@SuppressWarnings("unchecked")
Iterator<Subclass>[] iters = new Iterator[subclasses.size() + 1];
Iterator<Subclass> iter = subclasses.iterator();
int i = 0;
@ -317,6 +318,9 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
public abstract boolean isDiscriminatorInsertable();
public abstract List<Property> getPropertyClosure();
@Deprecated(since = "6.0")
public abstract Iterator<Property> getPropertyClosureIterator();
public abstract Iterator<Table> getTableClosureIterator();
@ -335,17 +339,27 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
subclassTables.add( subclassTable );
}
@Deprecated(since = "6.0")
public Iterator<Property> getSubclassPropertyClosureIterator() {
ArrayList<Iterator<Property>> iters = new ArrayList<>();
iters.add( getPropertyClosureIterator() );
iters.add( subclassProperties.iterator() );
for ( int i = 0; i < subclassJoins.size(); i++ ) {
Join join = subclassJoins.get( i );
for (Join join : subclassJoins) {
iters.add( join.getPropertyIterator() );
}
return new JoinedIterator<>( iters );
}
public List<Property> getSubclassPropertyClosure() {
ArrayList<List<Property>> lists = new ArrayList<>();
lists.add( getPropertyClosure() );
lists.add( subclassProperties );
for (Join join : subclassJoins) {
lists.add( join.getProperties() );
}
return new JoinedList<>( lists );
}
public Iterator<Join> getSubclassJoinClosureIterator() {
return new JoinedIterator<>( getJoinClosureIterator(), subclassJoins.iterator() );
}
@ -397,7 +411,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
pk.setName( PK_ALIAS.toAliasString( table.getName() ) );
table.setPrimaryKey( pk );
pk.addColumns( getKey().getColumnIterator() );
pk.addColumns( getKey() );
}
public abstract String getWhere();
@ -425,12 +439,29 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
* Includes all properties defined as part of a join.
*
* @see #getReferencedProperty for a discussion of "referenceable"
*
* @return The referenceable property iterator.
*
* @deprecated use {@link #getReferenceableProperties()}
*/
@Deprecated(since = "6.0")
public Iterator<Property> getReferenceablePropertyIterator() {
return getPropertyClosureIterator();
}
/**
* Build a list of properties which may be referenced in association mappings.
* <p>
* Includes properties defined in superclasses of the mapping inheritance.
* Includes all properties defined as part of a join.
*
* @see #getReferencedProperty for a discussion of "referenceable"
* @return The referenceable property iterator.
*/
public List<Property> getReferenceableProperties() {
return getPropertyClosure();
}
/**
* Given a property path, locate the appropriate referenceable property reference.
* <p/>
@ -445,7 +476,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
*/
public Property getReferencedProperty(String propertyPath) throws MappingException {
try {
return getRecursiveProperty( propertyPath, getReferenceablePropertyIterator() );
return getRecursiveProperty( propertyPath, getReferenceableProperties() );
}
catch (MappingException e) {
throw new MappingException(
@ -456,7 +487,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
public Property getRecursiveProperty(String propertyPath) throws MappingException {
try {
return getRecursiveProperty( propertyPath, getPropertyClosureIterator() );
return getRecursiveProperty( propertyPath, getPropertyClosure() );
}
catch (MappingException e) {
throw new MappingException(
@ -465,7 +496,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
}
}
private Property getRecursiveProperty(String propertyPath, Iterator<Property> iter) throws MappingException {
private Property getRecursiveProperty(String propertyPath, List<Property> iter) throws MappingException {
Property property = null;
StringTokenizer st = new StringTokenizer( propertyPath, ".", false );
try {
@ -482,12 +513,10 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
else if ( identifierProperty == null && getIdentifierMapper() != null ) {
// we have an embedded composite identifier
try {
identifierProperty = getProperty( element, getIdentifierMapper().getPropertyIterator() );
if ( identifierProperty != null ) {
// the root of the incoming property path matched one
// of the embedded composite identifier properties
property = identifierProperty;
}
identifierProperty = getProperty( element, getIdentifierMapper().getProperties() );
// the root of the incoming property path matched one
// of the embedded composite identifier properties
property = identifierProperty;
}
catch (MappingException ignore) {
// ignore it...
@ -511,16 +540,13 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
return property;
}
private Property getProperty(String propertyName, Iterator<Property> iterator) throws MappingException {
if ( iterator.hasNext() ) {
String root = StringHelper.root( propertyName );
while ( iterator.hasNext() ) {
Property prop = iterator.next();
if ( prop.getName().equals( root )
|| (prop instanceof Backref || prop instanceof IndexBackref)
&& prop.getName().equals( propertyName ) ) {
return prop;
}
private Property getProperty(String propertyName, List<Property> properties) throws MappingException {
String root = StringHelper.root( propertyName );
for ( Property prop : properties ) {
if ( prop.getName().equals( root )
|| ( prop instanceof Backref || prop instanceof IndexBackref )
&& prop.getName().equals( propertyName ) ) {
return prop;
}
}
throw new MappingException( "property [" + propertyName + "] not found on entity [" + getEntityName() + "]" );
@ -533,12 +559,12 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
return identifierProperty;
}
else {
Iterator<Property> iter = getPropertyClosureIterator();
List<Property> closure = getPropertyClosure();
Component identifierMapper = getIdentifierMapper();
if ( identifierMapper != null ) {
iter = new JoinedIterator<>( identifierMapper.getPropertyIterator(), iter );
closure = new JoinedList<>( identifierMapper.getProperties(), closure );
}
return getProperty( propertyName, iter );
return getProperty( propertyName, closure );
}
}
@ -549,12 +575,12 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
return identifierProperty;
}
else {
Iterator<Property> iter = getSubclassPropertyClosureIterator();
List<Property> closure = getSubclassPropertyClosure();
Component identifierMapper = getIdentifierMapper();
if ( identifierMapper != null ) {
iter = new JoinedIterator<>( identifierMapper.getPropertyIterator(), iter );
closure = new JoinedList<>( identifierMapper.getProperties(), closure );
}
return getProperty( propertyName, iter );
return getProperty( propertyName, closure );
}
}
@ -606,21 +632,9 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
* @return {@code true} if a property with that name exists; {@code false} if not
*/
public boolean isPropertyDefinedInHierarchy(String name) {
if ( hasProperty( name ) ) {
return true;
}
if ( getSuperMappedSuperclass() != null
&& getSuperMappedSuperclass().isPropertyDefinedInHierarchy( name ) ) {
return true;
}
if ( getSuperclass() != null
&& getSuperclass().isPropertyDefinedInHierarchy( name ) ) {
return true;
}
return false;
return hasProperty( name )
|| getSuperMappedSuperclass() != null && getSuperMappedSuperclass().isPropertyDefinedInHierarchy( name )
||getSuperclass() != null && getSuperclass().isPropertyDefinedInHierarchy(name);
}
/**
@ -648,9 +662,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
}
public void validate(Mapping mapping) throws MappingException {
Iterator<Property> iter = getPropertyIterator();
while ( iter.hasNext() ) {
Property prop = iter.next();
for ( Property prop : getProperties() ) {
if ( !prop.isValid( mapping ) ) {
throw new MappingException(
"property mapping has wrong number of columns: " +
@ -666,9 +678,7 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
private void checkPropertyDuplication() throws MappingException {
HashSet<String> names = new HashSet<>();
Iterator<Property> iter = getPropertyIterator();
while ( iter.hasNext() ) {
Property prop = iter.next();
for ( Property prop : getProperties() ) {
if ( !names.add( prop.getName() ) ) {
throw new MappingException( "Duplicate property mapping of " + prop.getName() + " found in " + getEntityName() );
}
@ -756,24 +766,46 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
public Iterator<Property> getPropertyIterator() {
ArrayList<Iterator<Property>> iterators = new ArrayList<>();
iterators.add( properties.iterator() );
for ( int i = 0; i < joins.size(); i++ ) {
Join join = joins.get( i );
for (Join join : joins) {
iterators.add( join.getPropertyIterator() );
}
return new JoinedIterator<>( iterators );
}
public List<Property> getProperties() {
ArrayList<List<Property>> list = new ArrayList<>();
list.add( properties );
for (Join join : joins) {
list.add( join.getProperties() );
}
return new JoinedList<>( list );
}
/**
* Build an iterator over the properties defined on this class <b>which
* are not defined as part of a join</b>. As with {@link #getPropertyIterator},
* the returned iterator only accounts for non-identifier properties.
*
* @return An iterator over the non-joined "normal" properties.
*
* @deprecated use {@link #getUnjoinedProperties()}
*/
@Deprecated(since = "6.0")
public Iterator<Property> getUnjoinedPropertyIterator() {
return properties.iterator();
}
/**
* Get a list of the properties defined on this class <b>which
* are not defined as part of a join</b>. As with {@link #getProperties},
* the returned iterator only accounts for non-identifier properties.
*
* @return An iterator over the non-joined "normal" properties.
*/
public List<Property> getUnjoinedProperties() {
return properties;
}
public void setCustomSqlInsert(CustomSql customSql) {
if ( customSql != null ) {
setCustomSQLInsert(
@ -908,10 +940,12 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
this.isAbstract = isAbstract;
}
protected void checkColumnDuplication(Set<String> distinctColumns, Iterator<Selectable> columns)
protected void checkColumnDuplication(Set<String> distinctColumns, Value value)
throws MappingException {
while ( columns.hasNext() ) {
Selectable columnOrFormula = columns.next();
if (value == null) {
return;
}
for ( Selectable columnOrFormula : value.getSelectables() ) {
if ( !columnOrFormula.isFormula() ) {
Column col = (Column) columnOrFormula;
if ( !distinctColumns.add( col.getName() ) ) {
@ -927,26 +961,30 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
}
}
protected void checkPropertyColumnDuplication(Set distinctColumns, Iterator properties)
protected void checkPropertyColumnDuplication(Set<String> distinctColumns, List<Property> properties)
throws MappingException {
while ( properties.hasNext() ) {
Property prop = (Property) properties.next();
for (Property prop : properties) {
if ( prop.getValue() instanceof Component ) { //TODO: remove use of instanceof!
Component component = (Component) prop.getValue();
checkPropertyColumnDuplication( distinctColumns, component.getPropertyIterator() );
checkPropertyColumnDuplication( distinctColumns, component.getProperties() );
}
else {
if ( prop.isUpdateable() || prop.isInsertable() ) {
checkColumnDuplication( distinctColumns, prop.getColumnIterator() );
checkColumnDuplication( distinctColumns, prop.getValue() );
}
}
}
}
@Deprecated(since = "6.0")
protected Iterator<Property> getNonDuplicatedPropertyIterator() {
return getUnjoinedPropertyIterator();
}
protected List<Property> getNonDuplicatedProperties() {
return getUnjoinedProperties();
}
protected Iterator<Selectable> getDiscriminatorColumnIterator() {
return Collections.emptyIterator();
}
@ -956,16 +994,16 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
if ( getIdentifierMapper() == null ) {
//an identifier mapper => getKey will be included in the getNonDuplicatedPropertyIterator()
//and checked later, so it needs to be excluded
checkColumnDuplication( cols, getKey().getColumnIterator() );
checkColumnDuplication( cols, getKey() );
}
checkColumnDuplication( cols, getDiscriminatorColumnIterator() );
checkPropertyColumnDuplication( cols, getNonDuplicatedPropertyIterator() );
checkColumnDuplication( cols, getDiscriminator() );
checkPropertyColumnDuplication( cols, getNonDuplicatedProperties() );
Iterator<Join> iter = getJoinIterator();
while ( iter.hasNext() ) {
cols.clear();
Join join = iter.next();
checkColumnDuplication( cols, join.getKey().getColumnIterator() );
checkPropertyColumnDuplication( cols, join.getPropertyIterator() );
checkColumnDuplication( cols, join.getKey() );
checkPropertyColumnDuplication( cols, join.getProperties() );
}
}
@ -1029,17 +1067,11 @@ public abstract class PersistentClass implements AttributeContainer, Serializabl
}
public String getTuplizerImplClassName(RepresentationMode mode) {
if ( tuplizerImpls == null ) {
return null;
}
return (String) tuplizerImpls.get( mode );
return null;
}
public java.util.Map getTuplizerMap() {
if ( tuplizerImpls == null ) {
return null;
}
return Collections.unmodifiableMap( tuplizerImpls );
return null;
}
private Boolean hasNaturalId;

View File

@ -77,10 +77,30 @@ public class Property implements Serializable, MetaAttributable {
public int getColumnSpan() {
return value.getColumnSpan();
}
/**
* @deprecated moving away from the use of {@link Iterator} as a return type
*/
@Deprecated(since = "6.0")
public Iterator<Selectable> getColumnIterator() {
return value.getColumnIterator();
}
/**
* Delegates to {@link Value#getSelectables()}.
*/
public java.util.List<Selectable> getSelectables() {
return value.getSelectables();
}
/**
* Delegates to {@link Value#getColumns()}.
*
* @throws org.hibernate.AssertionFailure if the mapping involves formulas
*/
public java.util.List<Column> getColumns() {
return value.getColumns();
}
public String getName() {
return name;
@ -104,9 +124,7 @@ public class Property implements Serializable, MetaAttributable {
public void resetOptional(boolean optional) {
setOptional(optional);
Iterator<Selectable> columnIterator = getValue().getColumnIterator();
while ( columnIterator.hasNext() ) {
Selectable column = columnIterator.next();
for ( Selectable column: getValue().getSelectables() ) {
if (column instanceof Column) {
( (Column) column ).setNullable(optional);
}

View File

@ -8,6 +8,7 @@ package org.hibernate.mapping;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.hibernate.MappingException;
@ -125,11 +126,16 @@ public class RootClass extends PersistentClass implements TableOwner {
return this;
}
@Override
@Override @Deprecated
public Iterator<Property> getPropertyClosureIterator() {
return getPropertyIterator();
}
@Override
public List<Property> getPropertyClosure() {
return getProperties();
}
@Override
public Iterator<Table> getTableClosureIterator() {
return new SingletonIterator<>( getTable() );

View File

@ -6,7 +6,6 @@
*/
package org.hibernate.mapping;
import java.util.Iterator;
import java.util.function.Supplier;
import org.hibernate.MappingException;
@ -71,10 +70,8 @@ public class Set extends Collection {
void createPrimaryKey() {
if ( !isOneToMany() ) {
PrimaryKey pk = new PrimaryKey( getCollectionTable() );
pk.addColumns( getKey().getColumnIterator() );
Iterator<?> iter = getElement().getColumnIterator();
while ( iter.hasNext() ) {
Object selectable = iter.next();
pk.addColumns( getKey() );
for ( Selectable selectable : getElement().getSelectables() ) {
if ( selectable instanceof Column ) {
Column col = (Column) selectable;
if ( !col.isNullable() ) {
@ -85,18 +82,18 @@ public class Set extends Collection {
}
}
}
if ( pk.getColumnSpan() == getKey().getColumnSpan() ) {
if ( pk.getColumnSpan() != getKey().getColumnSpan() ) {
getCollectionTable().setPrimaryKey( pk );
}
// else {
//for backward compatibility, allow a set with no not-null
//element columns, using all columns in the row locator SQL
//TODO: create an implicit not null constraint on all cols?
}
else {
getCollectionTable().setPrimaryKey( pk );
}
// }
}
else {
// else {
//create an index on the key columns??
}
// }
}
public Object accept(ValueVisitor visitor) {

View File

@ -17,6 +17,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import org.hibernate.AssertionFailure;
import org.hibernate.FetchMode;
import org.hibernate.MappingException;
import org.hibernate.TimeZoneStorageStrategy;
@ -70,7 +71,7 @@ public abstract class SimpleValue implements KeyValue {
public static final String DEFAULT_ID_GEN_STRATEGY = "assigned";
private MetadataBuildingContext buildingContext;
private final MetadataBuildingContext buildingContext;
private final MetadataImplementor metadata;
private final List<Selectable> columns = new ArrayList<>();
@ -187,10 +188,8 @@ public abstract class SimpleValue implements KeyValue {
@Override
public boolean hasFormula() {
Iterator iter = getColumnIterator();
while ( iter.hasNext() ) {
Object o = iter.next();
if (o instanceof Formula) {
for ( Selectable selectable : getSelectables() ) {
if ( selectable instanceof Formula ) {
return true;
}
}
@ -206,7 +205,7 @@ public abstract class SimpleValue implements KeyValue {
return columns.get( position );
}
@Override
@Override @Deprecated
public Iterator<Selectable> getColumnIterator() {
return columns.iterator();
}
@ -216,8 +215,15 @@ public abstract class SimpleValue implements KeyValue {
return columns;
}
public List getConstraintColumns() {
return columns;
@Override
public List<Column> getColumns() {
if ( hasFormula() ) {
// in principle this method should never get called
// if we have formulas in the mapping
throw new AssertionFailure("value involves formulas");
}
//noinspection unchecked, rawtypes
return (List) columns;
}
public Iterator<Selectable> getConstraintColumnIterator() {
@ -236,7 +242,7 @@ public abstract class SimpleValue implements KeyValue {
.getServiceRegistry()
.getService( ClassLoaderService.class );
try {
final Class<? extends AttributeConverter> converterClass = cls.classForName( converterClassName );
final Class<? extends AttributeConverter<?,?>> converterClass = cls.classForName( converterClassName );
this.attributeConverterDescriptor = new ClassBasedConverterDescriptor(
converterClass,
false,
@ -285,12 +291,20 @@ public abstract class SimpleValue implements KeyValue {
@Override
public void createForeignKeyOfEntity(String entityName) {
if ( !hasFormula() && !"none".equals(getForeignKeyName())) {
ForeignKey fk = table.createForeignKey( getForeignKeyName(), getConstraintColumns(), entityName, getForeignKeyDefinition() );
fk.setCascadeDeleteEnabled(cascadeDeleteEnabled);
if ( !hasFormula() && !"none".equals( getForeignKeyName() ) ) {
table.createForeignKey( getForeignKeyName(), getConstraintColumns(), entityName, getForeignKeyDefinition() )
.setCascadeDeleteEnabled(cascadeDeleteEnabled);
}
}
@Override
public void createUniqueKey() {
if ( hasFormula() ) {
throw new MappingException( "unique key constraint involves formulas" );
}
getTable().createUniqueKey( getConstraintColumns() );
}
private IdentifierGeneratorCreator customIdGeneratorCreator;
private IdentifierGenerator identifierGenerator;
@ -395,7 +409,7 @@ public abstract class SimpleValue implements KeyValue {
params.setProperty( PersistentIdentifierGenerator.TABLE, tableName );
//pass the column name (a generated id almost always has a single column)
final String columnName = ( (Column) getColumnIterator().next() ).getQuotedName( dialect );
final String columnName = ( (Column) getSelectables().get(0) ).getQuotedName( dialect );
params.setProperty( PersistentIdentifierGenerator.PK, columnName );
//pass the entity-name, if not a collection-id
@ -485,7 +499,9 @@ public abstract class SimpleValue implements KeyValue {
}
public boolean isIdentityColumn(IdentifierGeneratorFactory identifierGeneratorFactory, Dialect dialect) {
return IdentityGenerator.class.isAssignableFrom(identifierGeneratorFactory.getIdentifierGeneratorClass( identifierGeneratorStrategy ));
return IdentityGenerator.class.isAssignableFrom(
identifierGeneratorFactory.getIdentifierGeneratorClass( identifierGeneratorStrategy )
);
}
public Properties getIdentifierGeneratorProperties() {
@ -553,9 +569,7 @@ public abstract class SimpleValue implements KeyValue {
}
public boolean isNullable() {
Iterator itr = getColumnIterator();
while ( itr.hasNext() ) {
final Object selectable = itr.next();
for (Selectable selectable : getSelectables()) {
if ( selectable instanceof Formula ) {
// if there are *any* formulas, then the Value overall is
// considered nullable
@ -698,7 +712,6 @@ public abstract class SimpleValue implements KeyValue {
*
* @todo : see if we already have previously built a custom on-the-fly BasicType for this AttributeConverter; see note below about caching
*/
@SuppressWarnings("unchecked")
private Type buildAttributeConverterTypeAdapter() {
// todo : validate the number of columns present here?
@ -721,7 +734,6 @@ public abstract class SimpleValue implements KeyValue {
final BasicJavaType<?> domainJtd = (BasicJavaType<?>) jpaAttributeConverter.getDomainJavaType();
// build the SqlTypeDescriptor adapter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Going back to the illustration, this should be a SqlTypeDescriptor that handles the Integer <-> String
// conversions. This is the more complicated piece. First we need to determine the JDBC type code
@ -846,7 +858,7 @@ public abstract class SimpleValue implements KeyValue {
@Override
public String toString() {
return getClass().getName() + '(' + columns.toString() + ')';
return getClass().getName() + '(' + columns + ')';
}
public Object accept(ValueVisitor visitor) {
@ -937,7 +949,7 @@ public abstract class SimpleValue implements KeyValue {
table.getCatalog(),
table.getSchema(),
table.getName(),
Boolean.valueOf( typeParameters.getProperty( DynamicParameterizedType.IS_PRIMARY_KEY ) ),
Boolean.parseBoolean( typeParameters.getProperty( DynamicParameterizedType.IS_PRIMARY_KEY ) ),
columnNames,
columnLengths
)
@ -990,7 +1002,7 @@ public abstract class SimpleValue implements KeyValue {
private static final class ParameterTypeImpl implements DynamicParameterizedType.ParameterType {
private final Class returnedClass;
private final Class<?> returnedClass;
private final Annotation[] annotationsMethod;
private final String catalog;
private final String schema;
@ -1000,7 +1012,7 @@ public abstract class SimpleValue implements KeyValue {
private final Long[] columnLengths;
private ParameterTypeImpl(
Class returnedClass,
Class<?> returnedClass,
Annotation[] annotationsMethod,
String catalog,
String schema,
@ -1019,7 +1031,7 @@ public abstract class SimpleValue implements KeyValue {
}
@Override
public Class getReturnedClass() {
public Class<?> getReturnedClass() {
return returnedClass;
}

View File

@ -7,11 +7,13 @@
package org.hibernate.mapping;
import java.util.Iterator;
import java.util.List;
import org.hibernate.MappingException;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.collections.JoinedList;
/**
* @author Gavin King
@ -22,7 +24,7 @@ public class SingleTableSubclass extends Subclass {
super( superclass, metadataBuildingContext );
}
@SuppressWarnings("unchecked")
@Deprecated
protected Iterator<Property> getNonDuplicatedPropertyIterator() {
return new JoinedIterator<>(
getSuperclass().getUnjoinedPropertyIterator(),
@ -30,13 +32,14 @@ public class SingleTableSubclass extends Subclass {
);
}
protected List<Property> getNonDuplicatedProperties() {
return new JoinedList<>( getSuperclass().getUnjoinedProperties(), getUnjoinedProperties() );
}
protected Iterator<Selectable> getDiscriminatorColumnIterator() {
if ( isDiscriminatorInsertable() && !getDiscriminator().hasFormula() ) {
return getDiscriminator().getColumnIterator();
}
else {
return super.getDiscriminatorColumnIterator();
}
return isDiscriminatorInsertable() && !getDiscriminator().hasFormula()
? getDiscriminator().getColumnIterator()
: super.getDiscriminatorColumnIterator();
}
public Object accept(PersistentClassVisitor mv) {

View File

@ -6,9 +6,6 @@
*/
package org.hibernate.mapping;
/**
*
*/
public interface SortableValue {
boolean isSorted();

View File

@ -5,10 +5,12 @@
* 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.List;
import java.util.Map;
import org.hibernate.AssertionFailure;
@ -16,6 +18,7 @@ import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.engine.OptimisticLockStyle;
import org.hibernate.internal.FilterConfiguration;
import org.hibernate.internal.util.collections.JoinedIterator;
import org.hibernate.internal.util.collections.JoinedList;
import org.hibernate.internal.util.collections.SingletonIterator;
import org.hibernate.metamodel.RepresentationMode;
import org.hibernate.persister.entity.EntityPersister;
@ -102,12 +105,19 @@ public class Subclass extends PersistentClass {
getSuperclass().addSubclassJoin(j);
}
@Override
public List<Property> getPropertyClosure() {
return new JoinedList<>( getSuperclass().getPropertyClosure(), getProperties() );
}
@Deprecated
public Iterator<Property> getPropertyClosureIterator() {
return new JoinedIterator<>(
getSuperclass().getPropertyClosureIterator(),
getPropertyIterator()
);
}
public Iterator<Table> getTableClosureIterator() {
return new JoinedIterator<>(
getSuperclass().getTableClosureIterator(),
@ -149,12 +159,9 @@ public class Subclass extends PersistentClass {
return getSuperclass().hasEmbeddedIdentifier();
}
public Class<? extends EntityPersister> getEntityPersisterClass() {
if (classPersisterClass==null) {
return getSuperclass().getEntityPersisterClass();
}
else {
return classPersisterClass;
}
return classPersisterClass == null
? getSuperclass().getEntityPersisterClass()
: classPersisterClass;
}
public Table getRootTable() {

View File

@ -9,6 +9,7 @@ package org.hibernate.mapping;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
@ -38,7 +39,6 @@ import org.jboss.logging.Logger;
*
* @author Gavin King
*/
@SuppressWarnings("deprecation")
public class Table implements RelationalModel, Serializable, ContributableDatabaseObject {
private static final Logger log = Logger.getLogger( Table.class );
private static final Column[] EMPTY_COLUMN_ARRAY = new Column[0];
@ -52,14 +52,14 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
/**
* contains all columns, including the primary key
*/
private Map<String, Column> columns = new LinkedHashMap<>();
private final Map<String, Column> columns = new LinkedHashMap<>();
private KeyValue idValue;
private PrimaryKey primaryKey;
private Map<ForeignKeyKey, ForeignKey> foreignKeys = new LinkedHashMap<>();
private Map<String, Index> indexes = new LinkedHashMap<>();
private Map<String,UniqueKey> uniqueKeys = new LinkedHashMap<>();
private final Map<ForeignKeyKey, ForeignKey> foreignKeys = new LinkedHashMap<>();
private final Map<String, Index> indexes = new LinkedHashMap<>();
private final Map<String,UniqueKey> uniqueKeys = new LinkedHashMap<>();
private int uniqueInteger;
private List<String> checkConstraints = new ArrayList<>();
private final List<String> checkConstraints = new ArrayList<>();
private String rowId;
private String subselect;
private boolean isAbstract;
@ -229,7 +229,7 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
return null;
}
Column myColumn = (Column) columns.get( column.getCanonicalName() );
Column myColumn = columns.get( column.getCanonicalName() );
return column.equals( myColumn ) ?
myColumn :
@ -241,7 +241,7 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
return null;
}
return (Column) columns.get( name.getCanonicalName() );
return columns.get( name.getCanonicalName() );
}
public Column getColumn(int n) {
@ -249,7 +249,7 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
for ( int i = 0; i < n - 1; i++ ) {
iter.next();
}
return (Column) iter.next();
return iter.next();
}
public void addColumn(Column column) {
@ -285,6 +285,10 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
return columns.values().iterator();
}
public Collection<Column> getColumns() {
return columns.values();
}
public Iterator<Index> getIndexIterator() {
return indexes.values().iterator();
}
@ -425,7 +429,7 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
List<String> results = new ArrayList<>();
while ( iter.hasNext() ) {
final Column column = (Column) iter.next();
final Column column = iter.next();
final ColumnInformation columnInfo = tableInfo.getColumn( Identifier.toIdentifier( column.getName(), column.isQuoted() ) );
if ( columnInfo == null ) {
@ -651,7 +655,9 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
public UniqueKey createUniqueKey(List<Column> keyColumns) {
String keyName = Constraint.generateName( "UK_", this, keyColumns );
UniqueKey uk = getOrCreateUniqueKey( keyName );
uk.addColumns( keyColumns.iterator() );
for (Column keyColumn : keyColumns) {
uk.addColumn( keyColumn );
}
return uk;
}
@ -691,8 +697,10 @@ public class Table implements RelationalModel, Serializable, ContributableDataba
fk = new ForeignKey();
fk.setTable( this );
fk.setReferencedEntityName( referencedEntityName );
fk.setKeyDefinition(keyDefinition);
fk.addColumns( keyColumns.iterator() );
fk.setKeyDefinition( keyDefinition );
for (Column keyColumn : keyColumns) {
fk.addColumn( keyColumn );
}
if ( referencedColumns != null ) {
fk.addReferencedColumns( referencedColumns.iterator() );
}

View File

@ -12,8 +12,6 @@ import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.engine.spi.Mapping;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.type.ComponentType;
import org.hibernate.type.Type;
import java.util.Objects;
@ -44,9 +42,6 @@ public abstract class ToOne extends SimpleValue implements Fetchable, SortableVa
this.fetchMode=fetchMode;
}
public abstract void createForeignKey() throws MappingException;
public abstract Type getType() throws MappingException;
public String getReferencedPropertyName() {
return referencedPropertyName;
}
@ -98,8 +93,8 @@ public abstract class ToOne extends SimpleValue implements Fetchable, SortableVa
public boolean isSame(ToOne other) {
return super.isSame( other )
&& Objects.equals( referencedPropertyName, other.referencedPropertyName )
&& Objects.equals( referencedEntityName, other.referencedEntityName );
&& Objects.equals( referencedPropertyName, other.referencedPropertyName )
&& Objects.equals( referencedEntityName, other.referencedEntityName );
}
public boolean isValid(Mapping mapping) throws MappingException {

View File

@ -6,6 +6,7 @@
*/
package org.hibernate.mapping;
import java.util.Iterator;
import java.util.List;
import org.hibernate.MappingException;
import org.hibernate.boot.spi.MetadataBuildingContext;
@ -35,11 +36,17 @@ public class UnionSubclass extends Subclass implements TableOwner {
public java.util.Set<String> getSynchronizedTables() {
return synchronizedTables;
}
@Deprecated
protected Iterator<Property> getNonDuplicatedPropertyIterator() {
return getPropertyClosureIterator();
}
@Override
protected List<Property> getNonDuplicatedProperties() {
return getPropertyClosure();
}
public void validate(Mapping mapping) throws MappingException {
super.validate(mapping);
if ( key!=null && !key.isValid(mapping) ) {

View File

@ -17,8 +17,8 @@ import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.Type;
/**
* A value is anything that is persisted by value, instead of
* by reference. It is essentially a Hibernate Type, together
* A value is anything that is persisted by value, instead of by
* reference. It is essentially a Hibernate {@link Type}, together
* with zero or more columns. Values are wrapped by things with
* higher level semantics, for example properties, collections,
* classes.
@ -26,20 +26,71 @@ import org.hibernate.type.Type;
* @author Gavin King
*/
public interface Value extends Serializable {
/**
* The number of columns and formulas in the mapping.
*/
int getColumnSpan();
/**
* @deprecated moving away from the use of {@link Iterator} as a return type
*/
@Deprecated(since = "6.0")
Iterator<Selectable> getColumnIterator();
/**
* The mapping to columns and formulas.
*/
List<Selectable> getSelectables();
/**
* If the mapping involves only columns, return them.
*
* @throws org.hibernate.AssertionFailure if the mapping involves formulas
*/
List<Column> getColumns();
/**
* Same as {@link #getSelectables()} except it returns the PK for the
* non-owning side of a one-to-one association.
*/
default List<Selectable> getVirtualSelectables() {
return getSelectables();
}
/**
* Same as {@link #getColumns()} except it returns the PK for the
* non-owning side of a one-to-one association.
*
* @throws org.hibernate.AssertionFailure if the mapping involves formulas
*/
default List<Column> getConstraintColumns() {
return getColumns();
}
Type getType() throws MappingException;
FetchMode getFetchMode();
Table getTable();
boolean hasFormula();
boolean isAlternateUniqueKey();
boolean isNullable();
void createForeignKey() throws MappingException;
void createForeignKey();
void createUniqueKey();
boolean isSimpleValue();
boolean isValid(Mapping mapping) throws MappingException;
void setTypeUsingReflection(String className, String propertyName) throws MappingException;
Object accept(ValueVisitor visitor);
boolean isSame(Value other);
boolean[] getColumnInsertability();

View File

@ -6,7 +6,6 @@
*/
package org.hibernate.metamodel.internal;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -40,14 +39,12 @@ public abstract class AbstractEmbeddableRepresentationStrategy implements Embedd
this.attributeNameToPositionMap = new ConcurrentHashMap<>( propertySpan );
boolean foundCustomAccessor = false;
Iterator itr = bootDescriptor.getPropertyIterator();
int i = 0;
while ( itr.hasNext() ) {
final Property prop = ( Property ) itr.next();
propertyAccesses[i] = buildPropertyAccess( prop );
attributeNameToPositionMap.put( prop.getName(), i );
for ( Property property : bootDescriptor.getProperties() ) {
propertyAccesses[i] = buildPropertyAccess( property );
attributeNameToPositionMap.put( property.getName(), i );
if ( !prop.isBasicPropertyAccessor() ) {
if ( !property.isBasicPropertyAccessor() ) {
foundCustomAccessor = true;
}

View File

@ -251,7 +251,8 @@ public class AttributeFactory {
else {
// we should have a non-dynamic embeddable
assert component.getComponentClassName() != null;
final Class<Y> embeddableClass = component.getComponentClass();
@SuppressWarnings("unchecked")
final Class<Y> embeddableClass = (Class<Y>) component.getComponentClass();
final EmbeddableDomainType<Y> cached = context.locateEmbeddable( embeddableClass, component );
if ( cached != null ) {
@ -274,9 +275,7 @@ public class AttributeFactory {
}
final EmbeddableTypeImpl.InFlightAccess<Y> inFlightAccess = embeddableType.getInFlightAccess();
final Iterator<Property> subProperties = component.getPropertyIterator();
while ( subProperties.hasNext() ) {
final Property property = subProperties.next();
for ( Property property : component.getProperties() ) {
final PersistentAttribute<Y, Y> attribute = buildAttribute( embeddableType, property, context );
if ( attribute != null ) {
inFlightAccess.addAttribute( attribute );

View File

@ -113,7 +113,8 @@ public class EntityRepresentationStrategyPojoStandard implements EntityRepresent
if ( bootDescriptor.getIdentifierMapper() != null ) {
mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo(
bootDescriptor.getIdentifierMapper(),
() -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() ).getMappingModelPart().getEmbeddableTypeDescriptor(),
() -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() )
.getMappingModelPart().getEmbeddableTypeDescriptor(),
// we currently do not support custom instantiators for identifiers
null,
creationContext
@ -122,7 +123,8 @@ public class EntityRepresentationStrategyPojoStandard implements EntityRepresent
else if ( bootDescriptorIdentifier != null ) {
mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo(
(Component) bootDescriptorIdentifier,
() -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() ).getMappingModelPart().getEmbeddableTypeDescriptor(),
() -> ( ( CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType() )
.getMappingModelPart().getEmbeddableTypeDescriptor(),
// we currently do not support custom instantiators for identifiers
null,
creationContext
@ -223,14 +225,11 @@ public class EntityRepresentationStrategyPojoStandard implements EntityRepresent
proxyInterfaces.add( HibernateProxy.class );
Iterator<?> properties = bootDescriptor.getPropertyIterator();
Class<?> clazz = bootDescriptor.getMappedClass();
final Method idGetterMethod;
final Method idSetterMethod;
try {
while ( properties.hasNext() ) {
Property property = (Property) properties.next();
for ( Property property : bootDescriptor.getProperties() ) {
ProxyFactoryHelper.validateGetterSetterMethodProxyability(
"Getter",
property.getGetter( clazz ).getMethod()

View File

@ -256,7 +256,8 @@ public class MetadataContext {
LOG.trace( "Wrapping up metadata context..." );
}
boolean staticMetamodelScanEnabled = this.jpaStaticMetaModelPopulationSetting != JpaStaticMetaModelPopulationSetting.DISABLED;
boolean staticMetamodelScanEnabled =
this.jpaStaticMetaModelPopulationSetting != JpaStaticMetaModelPopulationSetting.DISABLED;
//we need to process types from superclasses to subclasses
for ( Object mapping : orderedMappings ) {
@ -266,7 +267,8 @@ public class MetadataContext {
LOG.trace( "Starting entity [" + safeMapping.getEntityName() + ']' );
}
try {
final EntityDomainType<Object> jpaMapping = (EntityDomainType<Object>) entityTypesByPersistentClass.get( safeMapping );
final EntityDomainType<Object> jpaMapping = (EntityDomainType<Object>)
entityTypesByPersistentClass.get( safeMapping );
applyIdMetadata( safeMapping, jpaMapping );
applyVersionAttribute( safeMapping, jpaMapping );
@ -315,7 +317,8 @@ public class MetadataContext {
LOG.trace( "Starting mapped superclass [" + safeMapping.getMappedClass().getName() + ']' );
}
try {
final MappedSuperclassDomainType<Object> jpaType = (MappedSuperclassDomainType<Object>) mappedSuperclassByMappedSuperclassMapping.get( safeMapping );
final MappedSuperclassDomainType<Object> jpaType = (MappedSuperclassDomainType<Object>)
mappedSuperclassByMappedSuperclassMapping.get( safeMapping );
applyIdMetadata( safeMapping, jpaType );
applyVersionAttribute( safeMapping, jpaType );
@ -366,10 +369,9 @@ public class MetadataContext {
for ( EmbeddableDomainType<?> embeddable : processingEmbeddables ) {
final Component component = componentByEmbeddable.get( embeddable );
final Iterator<Property> propertyItr = component.getPropertyIterator();
while ( propertyItr.hasNext() ) {
final Property property = propertyItr.next();
final PersistentAttribute<Object, ?> attribute = attributeFactory.buildAttribute( (ManagedDomainType<Object>) embeddable, property );
for ( Property property : component.getProperties() ) {
final PersistentAttribute<Object, ?> attribute =
attributeFactory.buildAttribute( (ManagedDomainType<Object>) embeddable, property );
if ( attribute != null ) {
addAttribute( embeddable, attribute );
}
@ -386,16 +388,19 @@ public class MetadataContext {
}
private void addAttribute(ManagedDomainType<?> type, PersistentAttribute<Object, ?> attribute) {
final AttributeContainer.InFlightAccess<Object> inFlightAccess = ( (AttributeContainer<Object>) type ).getInFlightAccess();
//noinspection unchecked
AttributeContainer<Object> container = (AttributeContainer<Object>) type;
final AttributeContainer.InFlightAccess<Object> inFlightAccess = container.getInFlightAccess();
final boolean virtual = attribute.getPersistentAttributeType() == Attribute.PersistentAttributeType.EMBEDDED
&& attribute.getAttributeJavaType() instanceof EntityJavaType<?>;
if ( virtual ) {
final EmbeddableDomainType<?> embeddableDomainType = (EmbeddableDomainType<?>) attribute.getValueGraphType();
final Component component = componentByEmbeddable.get( embeddableDomainType );
final Iterator<Property> propertyItr = component.getPropertyIterator();
while ( propertyItr.hasNext() ) {
final Property property = propertyItr.next();
final PersistentAttribute<Object, ?> subAttribute = attributeFactory.buildAttribute( (ManagedDomainType<Object>) embeddableDomainType, property );
for ( Property property : component.getProperties() ) {
//noinspection unchecked
ManagedDomainType<Object> managedDomainType = (ManagedDomainType<Object>) embeddableDomainType;
final PersistentAttribute<Object, ?> subAttribute =
attributeFactory.buildAttribute( managedDomainType, property );
if ( subAttribute != null ) {
inFlightAccess.addAttribute( subAttribute );
}
@ -411,7 +416,6 @@ public class MetadataContext {
// 2) register the part (mapping role)
// 3) somehow get the mapping role "into" the part (setter, ?)
@SuppressWarnings({"unchecked", "rawtypes"})
private void applyIdMetadata(PersistentClass persistentClass, IdentifiableDomainType<?> identifiableType) {
if ( persistentClass.hasIdentifierProperty() ) {
final Property declaredIdentifierProperty = persistentClass.getDeclaredIdentifierProperty();
@ -421,53 +425,54 @@ public class MetadataContext {
declaredIdentifierProperty
);
//noinspection unchecked rawtypes
( ( AttributeContainer) identifiableType ).getInFlightAccess().applyIdAttribute( idAttribute );
}
}
else {
// we have a non-aggregated composite-id
//noinspection RedundantClassCall
if ( ! Component.class.isInstance( persistentClass.getIdentifier() ) ) {
if ( !(persistentClass.getIdentifier() instanceof Component) ) {
throw new MappingException( "Expecting Component for id mapping with no id-attribute" );
}
// Handle the actual id-attributes
final Component cidValue = (Component) persistentClass.getIdentifier();
final Iterator<Property> cidPropertyItr;
final List<Property> cidProperties;
final int propertySpan;
final EmbeddableTypeImpl<?> idClassType;
final Component identifierMapper = persistentClass.getIdentifierMapper();
if ( identifierMapper != null ) {
cidPropertyItr = identifierMapper.getPropertyIterator();
cidProperties = identifierMapper.getProperties();
propertySpan = identifierMapper.getPropertySpan();
idClassType = applyIdClassMetadata( (Component) persistentClass.getIdentifier() );
}
else {
cidPropertyItr = cidValue.getPropertyIterator();
cidProperties = cidValue.getProperties();
propertySpan = cidValue.getPropertySpan();
idClassType = null;
}
assert cidValue.isEmbedded();
AbstractIdentifiableType idType = (AbstractIdentifiableType) entityTypesByEntityName.get( cidValue.getOwner().getEntityName() );
AbstractIdentifiableType<?> idType = (AbstractIdentifiableType<?>)
entityTypesByEntityName.get( cidValue.getOwner().getEntityName() );
//noinspection rawtypes
Set idAttributes = idType.getIdClassAttributesSafely();
if ( idAttributes == null ) {
idAttributes = new HashSet<>( propertySpan );
while ( cidPropertyItr.hasNext() ) {
final Property cidSubProperty = cidPropertyItr.next();
final SingularPersistentAttribute<?, Object> cidSubAttr = attributeFactory.buildIdAttribute(
idType,
cidSubProperty
);
for ( Property cidSubproperty : cidProperties ) {
final SingularPersistentAttribute<?, Object> cidSubAttr =
attributeFactory.buildIdAttribute( idType, cidSubproperty );
//noinspection unchecked
idAttributes.add( cidSubAttr );
}
}
( ( AttributeContainer) identifiableType ).getInFlightAccess().applyNonAggregatedIdAttributes( idAttributes, idClassType );
AttributeContainer<?> container = (AttributeContainer<?>) identifiableType;
//noinspection unchecked
container.getInFlightAccess().applyNonAggregatedIdAttributes( idAttributes, idClassType );
}
}
@ -486,12 +491,12 @@ public class MetadataContext {
return embeddableType;
}
@SuppressWarnings({"unchecked", "rawtypes"})
private <X> void applyIdMetadata(MappedSuperclass mappingType, MappedSuperclassDomainType<X> jpaMappingType) {
if ( mappingType.hasIdentifierProperty() ) {
final Property declaredIdentifierProperty = mappingType.getDeclaredIdentifierProperty();
if ( declaredIdentifierProperty != null ) {
final SingularPersistentAttribute<X, Object> attribute = attributeFactory.buildIdAttribute( jpaMappingType, declaredIdentifierProperty );
final SingularPersistentAttribute<X, Object> attribute =
attributeFactory.buildIdAttribute( jpaMappingType, declaredIdentifierProperty );
//noinspection unchecked
( ( AttributeContainer) jpaMappingType ).getInFlightAccess().applyIdAttribute( attribute );
}
@ -500,7 +505,7 @@ public class MetadataContext {
else if ( mappingType.getIdentifierMapper() != null ) {
Set<SingularPersistentAttribute<? super X, ?>> attributes = buildIdClassAttributes(
jpaMappingType,
mappingType.getIdentifierMapper().getPropertyIterator()
mappingType.getIdentifierMapper().getProperties()
);
//noinspection unchecked
( ( AttributeContainer<X>) jpaMappingType ).getInFlightAccess().applyIdClassAttributes( attributes );
@ -529,13 +534,13 @@ public class MetadataContext {
private <X> Set<SingularPersistentAttribute<? super X, ?>> buildIdClassAttributes(
IdentifiableDomainType<X> ownerType,
Iterator<Property> propertyIterator) {
List<Property> properties) {
if ( LOG.isTraceEnabled() ) {
LOG.trace( "Building old-school composite identifier [" + ownerType.getJavaType().getName() + ']' );
}
Set<SingularPersistentAttribute<? super X, ?>> attributes = new HashSet<>();
while ( propertyIterator.hasNext() ) {
attributes.add( attributeFactory.buildIdAttribute( ownerType, propertyIterator.next() ) );
for ( Property property : properties ) {
attributes.add( attributeFactory.buildIdAttribute( ownerType, property ) );
}
return attributes;
}

View File

@ -7,7 +7,6 @@
package org.hibernate.metamodel.mapping.internal;
import java.io.Serializable;
import java.util.Iterator;
import java.util.Locale;
import java.util.function.Consumer;
@ -152,9 +151,7 @@ public abstract class AbstractEmbeddableMapping implements EmbeddableMappingType
int attributeIndex = 0;
int columnPosition = 0;
final Iterator<Property> propertyIterator = bootDescriptor.getPropertyIterator();
while ( propertyIterator.hasNext() ) {
final Property bootPropertyDescriptor = propertyIterator.next();
for ( Property bootPropertyDescriptor : bootDescriptor.getProperties() ) {
final Type subtype = subtypes[ attributeIndex ];
attributeTypeValidator.check( bootPropertyDescriptor.getName(), subtype );

View File

@ -292,9 +292,7 @@ public class EmbeddableMappingTypeImpl extends AbstractEmbeddableMapping impleme
// Reset the attribute mappings that were added in previous attempts
this.attributeMappings.clear();
final Iterator<Property> propertyIterator = bootDescriptor.getPropertyIterator();
while ( propertyIterator.hasNext() ) {
final Property bootPropertyDescriptor = propertyIterator.next();
for ( Property bootPropertyDescriptor : bootDescriptor.getProperties() ) {
final AttributeMapping attributeMapping;
final Type subtype = subtypes[attributeIndex];

View File

@ -286,7 +286,7 @@ public class EntityCollectionPart
final BasicValuedModelPart basicFkTargetPart = (BasicValuedModelPart) fkTargetPart;
final SelectableMapping keySelectableMapping = SelectableMappingImpl.from(
fkKeyTableName,
fkBootDescriptorSource.getColumnIterator().next(),
fkBootDescriptorSource.getSelectables().get(0),
basicFkTargetPart.getJdbcMapping(),
dialect,
creationProcess.getSqmFunctionRegistry()

View File

@ -580,7 +580,7 @@ public class MappingModelCreationHelper {
final BasicValue index = (BasicValue) ( (IndexedCollection) bootValueMapping ).getIndex();
final SelectableMapping selectableMapping = SelectableMappingImpl.from(
tableExpression,
index.getColumnIterator().next(),
index.getSelectables().get(0),
creationContext.getTypeConfiguration().getBasicTypeForJavaType( Integer.class ),
dialect,
creationProcess.getSqmFunctionRegistry()
@ -631,7 +631,7 @@ public class MappingModelCreationHelper {
final BasicValue index = (BasicValue) ( (IndexedCollection) bootValueMapping ).getIndex();
final SelectableMapping selectableMapping = SelectableMappingImpl.from(
tableExpression,
index.getColumnIterator().next(),
index.getSelectables().get(0),
creationContext.getTypeConfiguration().getBasicTypeForJavaType( Integer.class ),
dialect,
creationProcess.getSqmFunctionRegistry()
@ -858,7 +858,7 @@ public class MappingModelCreationHelper {
final String tableExpression = getTableIdentifierExpression( bootValueMappingKey.getTable(), creationProcess );
final SelectableMapping keySelectableMapping = SelectableMappingImpl.from(
tableExpression,
bootValueMappingKey.getColumnIterator().next(),
bootValueMappingKey.getSelectables().get(0),
(JdbcMapping) keyType,
dialect,
creationProcess.getSqmFunctionRegistry()
@ -1320,7 +1320,7 @@ public class MappingModelCreationHelper {
final BasicValue basicValue = (BasicValue) bootMapKeyDescriptor;
final SelectableMapping selectableMapping = SelectableMappingImpl.from(
tableExpression,
basicValue.getColumnIterator().next(),
basicValue.getSelectables().get(0),
basicValue.resolve().getJdbcMapping(),
dialect,
creationProcess.getSqmFunctionRegistry()
@ -1403,7 +1403,7 @@ public class MappingModelCreationHelper {
final BasicValue basicElement = (BasicValue) element;
final SelectableMapping selectableMapping = SelectableMappingImpl.from(
tableExpression,
basicElement.getColumnIterator().next(),
basicElement.getSelectables().get(0),
basicElement.resolve().getJdbcMapping(),
dialect,
creationProcess.getSqmFunctionRegistry()

View File

@ -64,13 +64,13 @@ public class SelectableMappingsImpl implements SelectableMappings {
final List<JdbcMapping> jdbcMappings = new ArrayList<>();
resolveJdbcMappings( jdbcMappings, mapping, value.getType() );
final List<Selectable> constraintColumns = value.getSelectables();
final List<Selectable> selectables = value.getVirtualSelectables();
final SelectableMapping[] selectableMappings = new SelectableMapping[jdbcMappings.size()];
for ( int i = 0; i < constraintColumns.size(); i++ ) {
for ( int i = 0; i < selectables.size(); i++ ) {
selectableMappings[propertyOrder[i]] = SelectableMappingImpl.from(
containingTableExpression,
constraintColumns.get( i ),
selectables.get( i ),
jdbcMappings.get( propertyOrder[i] ),
dialect,
sqmFunctionRegistry
@ -85,13 +85,9 @@ public class SelectableMappingsImpl implements SelectableMappings {
final List<SelectableMapping> selectableMappings = CollectionHelper.arrayList( propertySpan );
embeddableMappingType.forEachAttributeMapping(
(index, attributeMapping) -> {
attributeMapping.forEachSelectable(
(columnIndex, selection) -> {
selectableMappings.add( selection );
}
);
}
(index, attributeMapping) -> attributeMapping.forEachSelectable(
(columnIndex, selection) -> selectableMappings.add( selection )
)
);
return new SelectableMappingsImpl( selectableMappings.toArray( new SelectableMapping[0] ) );

View File

@ -229,7 +229,7 @@ public class ToOneAttributeMapping
if ( join.getPersistentClass().getEntityName().equals( entityBinding.getEntityName() )
&& join.getPropertySpan() == 1
&& join.getTable() == manyToOne.getTable()
&& equal( join.getKey().getColumnIterator(), manyToOne.getColumnIterator() ) ) {
&& equal( join.getKey(), manyToOne ) ) {
bidirectionalAttributeName = join.getPropertyIterator().next().getName();
break;
}
@ -503,7 +503,9 @@ public class ToOneAttributeMapping
this.isConstrained = original.isConstrained;
}
private static boolean equal(Iterator<Selectable> lhsColumns, Iterator<Selectable> rhsColumns) {
private static boolean equal(Value lhsValue, Value rhsValue) {
Iterator<Selectable> lhsColumns = lhsValue.getColumnIterator();
Iterator<Selectable> rhsColumns = rhsValue.getColumnIterator();
boolean hasNext;
do {
final Selectable lhs = lhsColumns.next();

View File

@ -358,14 +358,12 @@ public abstract class AbstractCollectionPersister
// KEY
keyType = collectionBootDescriptor.getKey().getType();
Iterator<Selectable> columnIter = collectionBootDescriptor.getKey().getColumnIterator();
int keySpan = collectionBootDescriptor.getKey().getColumnSpan();
keyColumnNames = new String[keySpan];
keyColumnAliases = new String[keySpan];
int k = 0;
while ( columnIter.hasNext() ) {
for ( Column column: collectionBootDescriptor.getKey().getColumns() ) {
// NativeSQL: collect key column and auto-aliases
Column column = (Column) columnIter.next();
keyColumnNames[k] = column.getQuotedName( dialect );
keyColumnAliases[k] = column.getAlias( dialect, table );
k++;
@ -404,9 +402,7 @@ public abstract class AbstractCollectionPersister
columnInsertability = elementBootDescriptor.getColumnInsertability();
}
int j = 0;
columnIter = elementBootDescriptor.getColumnIterator();
while ( columnIter.hasNext() ) {
Selectable selectable = columnIter.next();
for ( Selectable selectable: elementBootDescriptor.getSelectables() ) {
elementColumnAliases[j] = selectable.getAlias( dialect, table );
if ( selectable.isFormula() ) {
Formula form = (Formula) selectable;
@ -455,7 +451,6 @@ public abstract class AbstractCollectionPersister
int indexSpan = indexedCollection.getIndex().getColumnSpan();
boolean[] indexColumnInsertability = indexedCollection.getIndex().getColumnInsertability();
boolean[] indexColumnUpdatability = indexedCollection.getIndex().getColumnUpdateability();
columnIter = indexedCollection.getIndex().getColumnIterator();
indexColumnNames = new String[indexSpan];
indexFormulaTemplates = new String[indexSpan];
indexFormulas = new String[indexSpan];
@ -464,8 +459,7 @@ public abstract class AbstractCollectionPersister
indexColumnAliases = new String[indexSpan];
int i = 0;
boolean hasFormula = false;
while ( columnIter.hasNext() ) {
Selectable s = columnIter.next();
for ( Selectable s: indexedCollection.getIndex().getSelectables() ) {
indexColumnAliases[i] = s.getAlias( dialect );
if ( s.isFormula() ) {
Formula indexForm = (Formula) s;
@ -516,8 +510,7 @@ public abstract class AbstractCollectionPersister
}
IdentifierCollection idColl = (IdentifierCollection) collectionBootDescriptor;
identifierType = idColl.getIdentifier().getType();
columnIter = idColl.getIdentifier().getColumnIterator();
Column col = (Column) columnIter.next();
Column col = idColl.getIdentifier().getColumns().get(0);
identifierColumnName = col.getQuotedName( dialect );
identifierColumnAlias = col.getAlias( dialect );
identifierGenerator = idColl.getIdentifier().createIdentifierGenerator(

View File

@ -284,7 +284,6 @@ public abstract class AbstractEntityPersister
public static final String VERSION_COLUMN_ALIAS = "version_";
private final String sqlAliasStem;
private EntityMappingType rootEntityDescriptor;
private final SingleIdEntityLoader<?> singleIdEntityLoader;
private final MultiIdEntityLoader<?> multiIdEntityLoader;
@ -774,24 +773,22 @@ public abstract class AbstractEntityPersister
multiIdEntityLoader = new MultiIdLoaderStandard<>( this, bootDescriptor, factory );
Iterator<Selectable> idColumns = bootDescriptor.getIdentifier().getColumnIterator();
int i = 0;
while ( idColumns.hasNext() ) {
Column col = (Column) idColumns.next();
rootTableKeyColumnNames[i] = col.getQuotedName( dialect );
rootTableKeyColumnReaders[i] = col.getReadExpr( dialect );
rootTableKeyColumnReaderTemplates[i] = col.getTemplate(
for ( Column column: bootDescriptor.getIdentifier().getColumns() ) {
rootTableKeyColumnNames[i] = column.getQuotedName( dialect );
rootTableKeyColumnReaders[i] = column.getReadExpr( dialect );
rootTableKeyColumnReaderTemplates[i] = column.getTemplate(
dialect,
factory.getQueryEngine().getSqmFunctionRegistry()
);
identifierAliases[i] = col.getAlias( dialect, bootDescriptor.getRootTable() );
identifierAliases[i] = column.getAlias( dialect, bootDescriptor.getRootTable() );
i++;
}
// VERSION
if ( bootDescriptor.isVersioned() ) {
versionColumnName = ( (Column) bootDescriptor.getVersion().getColumnIterator().next() ).getQuotedName( dialect );
versionColumnName = bootDescriptor.getVersion().getColumns().get(0).getQuotedName( dialect );
}
else {
versionColumnName = null;
@ -841,11 +838,9 @@ public abstract class AbstractEntityPersister
ArrayList<String[]> lazyColAliases = new ArrayList<>();
final ArrayList<Integer> lobPropertiesLocalCollector = new ArrayList<>();
Iterator<Property> properties = bootDescriptor.getPropertyClosureIterator();
i = 0;
boolean foundFormula = false;
while ( properties.hasNext() ) {
Property prop = properties.next();
for ( Property prop : bootDescriptor.getPropertyClosure() ) {
thisClassProperties.add( prop );
int span = prop.getColumnSpan();
@ -856,18 +851,16 @@ public abstract class AbstractEntityPersister
String[] colReaderTemplates = new String[span];
String[] colWriters = new String[span];
String[] formulaTemplates = new String[span];
Iterator<Selectable> colIter = prop.getColumnIterator();
int k = 0;
while ( colIter.hasNext() ) {
Selectable thing = colIter.next();
colAliases[k] = thing.getAlias( dialect, prop.getValue().getTable() );
if ( thing.isFormula() ) {
for ( Selectable selectable: prop.getSelectables() ) {
colAliases[k] = selectable.getAlias( dialect, prop.getValue().getTable() );
if ( selectable.isFormula() ) {
foundFormula = true;
( (Formula) thing ).setFormula( substituteBrackets( ( (Formula) thing ).getFormula() ) );
formulaTemplates[k] = thing.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() );
( (Formula) selectable ).setFormula( substituteBrackets( ( (Formula) selectable ).getFormula() ) );
formulaTemplates[k] = selectable.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() );
}
else {
Column col = (Column) thing;
Column col = (Column) selectable;
colNames[k] = col.getQuotedName( dialect );
colReaderTemplates[k] = col.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() );
colWriters[k] = col.getWriteExpr();
@ -945,9 +938,7 @@ public abstract class AbstractEntityPersister
ArrayList<Boolean> columnSelectables = new ArrayList<>();
ArrayList<Boolean> propNullables = new ArrayList<>();
Iterator<Property> iter = bootDescriptor.getSubclassPropertyClosureIterator();
while ( iter.hasNext() ) {
final Property prop = iter.next();
for ( Property prop : bootDescriptor.getSubclassPropertyClosure() ) {
names.add( prop.getName() );
classes.add( prop.getPersistentClass().getEntityName() );
types.add( prop.getType() );
@ -956,7 +947,6 @@ public abstract class AbstractEntityPersister
definedBySubclass.add( Boolean.valueOf( isDefinedBySubclass ) );
propNullables.add( Boolean.valueOf( prop.isOptional() || isDefinedBySubclass ) ); //TODO: is this completely correct?
final Iterator<Selectable> colIter = prop.getColumnIterator();
String[] cols = new String[ prop.getColumnSpan() ];
String[] readers = new String[ prop.getColumnSpan() ];
String[] readerTemplates = new String[ prop.getColumnSpan() ];
@ -968,7 +958,7 @@ public abstract class AbstractEntityPersister
final boolean lazy = ! EnhancementHelper.includeInBaseFetchGroup(
prop,
entityMetamodel.isInstrumented(),
(entityName) -> {
entityName -> {
final MetadataImplementor metadata = creationContext.getMetadata();
final PersistentClass entityBinding = metadata.getEntityBinding( entityName );
assert entityBinding != null;
@ -976,26 +966,25 @@ public abstract class AbstractEntityPersister
},
sessionFactoryOptions.isCollectionsInDefaultFetchGroupEnabled()
);
while ( colIter.hasNext() ) {
final Selectable thing = colIter.next();
if ( thing.isFormula() ) {
String template = thing.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() );
for ( Selectable selectable : prop.getSelectables() ) {
if ( selectable.isFormula() ) {
String template = selectable.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() );
formnos[l] = formulaTemplates.size();
colnos[l] = -1;
formulaTemplates.add( template );
forms[l] = template;
formulas.add( thing.getText( dialect ) );
formulaAliases.add( thing.getAlias( dialect ) );
formulas.add( selectable.getText( dialect ) );
formulaAliases.add( selectable.getAlias( dialect ) );
formulasLazy.add( lazy );
}
else {
Column col = (Column) thing;
Column col = (Column) selectable;
String colName = col.getQuotedName( dialect );
colnos[l] = columns.size(); //before add :-)
formnos[l] = -1;
columns.add( colName );
cols[l] = colName;
aliases.add( thing.getAlias( dialect, prop.getValue().getTable() ) );
aliases.add( selectable.getAlias( dialect, prop.getValue().getTable() ) );
columnsLazy.add( lazy );
columnSelectables.add( Boolean.valueOf( prop.isSelectable() ) );
@ -1059,29 +1048,9 @@ public abstract class AbstractEntityPersister
filterHelper = null;
}
// Check if we can use Reference Cached entities in 2lc
// todo : should really validate that the cache access type is read-only
boolean refCacheEntries = true;
if ( !factory.getSessionFactoryOptions().isDirectReferenceCacheEntriesEnabled() ) {
refCacheEntries = false;
}
useReferenceCacheEntries = useReferenceCacheEntries();
// for now, limit this to just entities that:
// 1) are immutable
if ( entityMetamodel.isMutable() ) {
refCacheEntries = false;
}
// 2) have no associations. Eventually we want to be a little more lenient with associations.
for ( Type type : getSubclassPropertyTypeClosure() ) {
if ( type.isAssociationType() ) {
refCacheEntries = false;
}
}
useReferenceCacheEntries = refCacheEntries;
this.cacheEntryHelper = buildCacheEntryHelper();
cacheEntryHelper = buildCacheEntryHelper();
if ( sessionFactoryOptions.isSecondLevelCacheEnabled() ) {
this.invalidateCache = canWriteToCache && shouldInvalidateCache( bootDescriptor, creationContext );
@ -1092,6 +1061,30 @@ public abstract class AbstractEntityPersister
}
private boolean useReferenceCacheEntries() {
// Check if we can use Reference Cached entities in 2lc
// todo : should really validate that the cache access type is read-only
if ( !factory.getSessionFactoryOptions().isDirectReferenceCacheEntriesEnabled() ) {
return false;
}
// for now, limit this to just entities that:
else if ( entityMetamodel.isMutable() ) {
// 1) are immutable
return false;
}
else {
// 2) have no associations.
// Eventually we want to be a little more lenient with associations.
for ( Type type : getSubclassPropertyTypeClosure() ) {
if ( type.isAssociationType() ) {
return false;
}
}
return true;
}
}
private static SingleIdEntityLoader<?> createBatchingIdEntityLoader(
EntityMappingType entityDescriptor,
int batchSize,
@ -2355,13 +2348,7 @@ public abstract class AbstractEntityPersister
}
private DiscriminatorMetadata buildTypeDiscriminatorMetadata() {
return new DiscriminatorMetadata() {
@Override
public Type getResolutionType() {
return new DiscriminatorType( (BasicType) getDiscriminatorType(), AbstractEntityPersister.this );
}
};
return () -> new DiscriminatorType( (BasicType<?>) getDiscriminatorType(), AbstractEntityPersister.this );
}
public static String generateTableAlias(String rootAlias, int tableNumber) {
@ -2530,13 +2517,11 @@ public abstract class AbstractEntityPersister
} );
}
if ( attributeNames != null ) {
final boolean[] propertyUpdateability = entityMetamodel.getPropertyUpdateability();
for ( String attributeName : attributeNames ) {
final Integer index = entityMetamodel.getPropertyIndexOrNull( attributeName );
if ( index != null && propertyUpdateability[index] && !fields.contains( index ) ) {
fields.add( index );
}
final boolean[] propertyUpdateability = entityMetamodel.getPropertyUpdateability();
for ( String attributeName : attributeNames ) {
final Integer index = entityMetamodel.getPropertyIndexOrNull( attributeName );
if ( index != null && propertyUpdateability[index] && !fields.contains( index ) ) {
fields.add( index );
}
}
@ -2599,7 +2584,7 @@ public abstract class AbstractEntityPersister
protected void initSubclassPropertyAliasesMap(PersistentClass model) throws MappingException {
// ALIASES
internalInitSubclassPropertyAliasesMap( null, model.getSubclassPropertyClosureIterator() );
internalInitSubclassPropertyAliasesMap( null, model.getSubclassPropertyClosure() );
// aliases for identifier ( alias.id ); skip if the entity defines a non-id property named 'id'
if ( !entityMetamodel.hasNonIdentifierPropertyNamedId() ) {
@ -2658,31 +2643,26 @@ public abstract class AbstractEntityPersister
}
private void internalInitSubclassPropertyAliasesMap(String path, Iterator<Property> propertyIterator) {
while ( propertyIterator.hasNext() ) {
Property prop = propertyIterator.next();
String propname = path == null ? prop.getName() : path + "." + prop.getName();
if ( prop.isComposite() ) {
Component component = (Component) prop.getValue();
Iterator<Property> compProps = component.getPropertyIterator();
internalInitSubclassPropertyAliasesMap( propname, compProps );
private void internalInitSubclassPropertyAliasesMap(String path, List<Property> properties) {
for (Property property : properties) {
String name = path == null ? property.getName() : path + "." + property.getName();
if ( property.isComposite() ) {
Component component = (Component) property.getValue();
internalInitSubclassPropertyAliasesMap( name, component.getProperties() );
}
else {
String[] aliases = new String[prop.getColumnSpan()];
String[] cols = new String[prop.getColumnSpan()];
Iterator<Selectable> colIter = prop.getColumnIterator();
String[] aliases = new String[property.getColumnSpan()];
String[] cols = new String[property.getColumnSpan()];
int l = 0;
while ( colIter.hasNext() ) {
Selectable thing = colIter.next();
for ( Selectable selectable: property.getSelectables() ) {
Dialect dialect = getFactory().getJdbcServices().getDialect();
aliases[l] = thing.getAlias( dialect, prop.getValue().getTable() );
cols[l] = thing.getText(dialect); // TODO: skip formulas?
aliases[l] = selectable.getAlias( dialect, property.getValue().getTable() );
cols[l] = selectable.getText(dialect); // TODO: skip formulas?
l++;
}
subclassPropertyAliases.put( propname, aliases );
subclassPropertyColumnNames.put( propname, cols );
subclassPropertyAliases.put( name, aliases );
subclassPropertyColumnNames.put( name, cols );
}
}
@ -4389,9 +4369,8 @@ public abstract class AbstractEntityPersister
public final boolean[] getPropertiesToUpdate(final int[] dirtyProperties, final boolean hasDirtyCollection) {
final boolean[] propsToUpdate = new boolean[entityMetamodel.getPropertySpan()];
final boolean[] updateability = getPropertyUpdateability(); //no need to check laziness, dirty checking handles that
for ( int j = 0; j < dirtyProperties.length; j++ ) {
int property = dirtyProperties[j];
if ( updateability[property] ) {
for ( int property: dirtyProperties ) {
if (updateability[property]) {
propsToUpdate[property] = true;
}
}
@ -4490,9 +4469,9 @@ public abstract class AbstractEntityPersister
private void logDirtyProperties(int[] props) {
if ( LOG.isTraceEnabled() ) {
for ( int i = 0; i < props.length; i++ ) {
String propertyName = entityMetamodel.getProperties()[props[i]].getName();
LOG.trace( StringHelper.qualify( getEntityName(), propertyName ) + " is dirty" );
for ( int prop : props ) {
String propertyName = entityMetamodel.getProperties()[prop].getName();
LOG.trace(StringHelper.qualify(getEntityName(), propertyName) + " is dirty");
}
}
}
@ -5501,6 +5480,7 @@ public abstract class AbstractEntityPersister
.getBootModel()
.getEntityBinding( getEntityName() );
EntityMappingType rootEntityDescriptor;
if ( superMappingType != null ) {
( (InFlightEntityMappingType) superMappingType ).prepareMappingModel( creationProcess );
if ( shouldProcessSuperMapping() ) {
@ -5528,10 +5508,8 @@ public abstract class AbstractEntityPersister
final NonIdentifierAttribute runtimeAttrDefinition = properties[i];
final Property bootProperty = bootEntityDescriptor.getProperty( runtimeAttrDefinition.getName() );
if ( superMappingType != null && superMappingType.findAttributeMapping( bootProperty.getName() ) != null ) {
// its defined on the super-type, skip it here
}
else {
if ( superMappingType == null
|| superMappingType.findAttributeMapping( bootProperty.getName() ) == null ) {
declaredAttributeMappings.put(
runtimeAttrDefinition.getName(),
generateNonIdAttributeMapping(
@ -5542,6 +5520,9 @@ public abstract class AbstractEntityPersister
)
);
}
// else {
// its defined on the supertype, skip it here
// }
}
getAttributeMappings();
@ -5577,8 +5558,8 @@ public abstract class AbstractEntityPersister
}
);
boolean needsMultiTableInsert;
if ( needsMultiTableInsert = isMultiTable() ) {
boolean needsMultiTableInsert = isMultiTable();
if ( needsMultiTableInsert ) {
creationProcess.registerInitializationCallback(
"Entity(" + getEntityName() + ") `sqmMultiTableMutationStrategy` interpretation",
() -> {
@ -6074,9 +6055,9 @@ public abstract class AbstractEntityPersister
attrColumnExpression = attrColumnNames[ 0 ];
isAttrColumnExpressionFormula = false;
final Iterator<Selectable> selectableIterator = basicBootValue.getColumnIterator();
assert selectableIterator.hasNext();
final Selectable selectable = selectableIterator.next();
final List<Selectable> selectables = basicBootValue.getSelectables();
assert !selectables.isEmpty();
final Selectable selectable = selectables.get(0);
assert attrColumnExpression.equals( selectable.getText(sessionFactory.getJdbcServices().getDialect()) );

View File

@ -173,7 +173,7 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
if ( discriminatorMapping != null ) {
log.debug( "Encountered explicit discriminator mapping for joined inheritance" );
final Selectable selectable = discriminatorMapping.getColumnIterator().next();
final Selectable selectable = discriminatorMapping.getSelectables().get(0);
if ( selectable instanceof Formula ) {
throw new MappingException( "Discriminator formulas on joined inheritance hierarchies not supported at this time" );
}
@ -259,12 +259,15 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
String[] keyCols = new String[idColumnSpan];
String[] keyColReaders = new String[idColumnSpan];
String[] keyColReaderTemplates = new String[idColumnSpan];
Iterator<Selectable> cItr = key.getColumnIterator();
List<Column> columns = key.getColumns();
for ( int k = 0; k < idColumnSpan; k++ ) {
Column column = (Column) cItr.next();
Column column = columns.get(k);
keyCols[k] = column.getQuotedName( factory.getJdbcServices().getDialect() );
keyColReaders[k] = column.getReadExpr( factory.getJdbcServices().getDialect() );
keyColReaderTemplates[k] = column.getTemplate( factory.getJdbcServices().getDialect(), factory.getQueryEngine().getSqmFunctionRegistry() );
keyColReaderTemplates[k] = column.getTemplate(
factory.getJdbcServices().getDialect(),
factory.getQueryEngine().getSqmFunctionRegistry()
);
}
keyColumns.add( keyCols );
keyColumnReaders.add( keyColReaders );
@ -297,9 +300,9 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
String[] keyColReaders = new String[joinIdColumnSpan];
String[] keyColReaderTemplates = new String[joinIdColumnSpan];
Iterator<Selectable> cItr = key.getColumnIterator();
List<Column> columns = key.getColumns();
for ( int k = 0; k < joinIdColumnSpan; k++ ) {
Column column = (Column) cItr.next();
Column column = columns.get(k);
keyCols[k] = column.getQuotedName( factory.getJdbcServices().getDialect() );
keyColReaders[k] = column.getReadExpr( factory.getJdbcServices().getDialect() );
keyColReaderTemplates[k] = column.getTemplate( factory.getJdbcServices().getDialect(), factory.getQueryEngine().getSqmFunctionRegistry() );
@ -335,9 +338,9 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
final String tableName = determineTableName( tab );
subclassTableNames.add( tableName );
String[] key = new String[idColumnSpan];
Iterator<Column> cItr = tab.getPrimaryKey().getColumnIterator();
List<Column> columns = tab.getPrimaryKey().getColumns();
for ( int k = 0; k < idColumnSpan; k++ ) {
key[k] = cItr.next().getQuotedName( factory.getJdbcServices().getDialect() );
key[k] = columns.get(k).getQuotedName( factory.getJdbcServices().getDialect() );
}
keyColumns.add( key );
}
@ -357,9 +360,9 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
String joinTableName = determineTableName( joinTable );
subclassTableNames.add( joinTableName );
String[] key = new String[idColumnSpan];
Iterator<Column> citer = joinTable.getPrimaryKey().getColumnIterator();
List<Column> columns = joinTable.getPrimaryKey().getColumns();
for ( int k = 0; k < idColumnSpan; k++ ) {
key[k] = citer.next().getQuotedName( factory.getJdbcServices().getDialect() );
key[k] = columns.get(k).getQuotedName( factory.getJdbcServices().getDialect() );
}
keyColumns.add( key );
}
@ -473,11 +476,9 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
int hydrateSpan = getPropertySpan();
naturalOrderPropertyTableNumbers = new int[hydrateSpan];
propertyTableNumbers = new int[hydrateSpan];
Iterator<Property> iter = persistentClass.getPropertyClosureIterator();
int i = 0;
while ( iter.hasNext() ) {
Property prop = iter.next();
String tabname = prop.getValue().getTable().getQualifiedName(
for ( Property property : persistentClass.getPropertyClosure() ) {
String tabname = property.getValue().getTable().getQualifiedName(
factory.getSqlStringGenerationContext()
);
propertyTableNumbers[i] = getTableId( tabname, this.tableNames );
@ -493,20 +494,16 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister {
ArrayList<Integer> formulaTableNumbers = new ArrayList<>();
ArrayList<Integer> propTableNumbers = new ArrayList<>();
iter = persistentClass.getSubclassPropertyClosureIterator();
while ( iter.hasNext() ) {
Property prop = iter.next();
Table tab = prop.getValue().getTable();
for ( Property property : persistentClass.getSubclassPropertyClosure() ) {
Table tab = property.getValue().getTable();
String tabname = tab.getQualifiedName(
factory.getSqlStringGenerationContext()
);
Integer tabnum = getTableId( tabname, subclassTableNameClosure );
propTableNumbers.add( tabnum );
Iterator<Selectable> citer = prop.getColumnIterator();
while ( citer.hasNext() ) {
Selectable thing = citer.next();
if ( thing.isFormula() ) {
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable.isFormula() ) {
formulaTableNumbers.add( tabnum );
}
else {

View File

@ -214,11 +214,9 @@ public class SingleTableEntityPersister extends AbstractEntityPersister {
? ExecuteUpdateResultCheckStyle.determineDefault( customSQLDelete[j], deleteCallable[j] )
: join.getCustomSQLDeleteCheckStyle();
Iterator<Selectable> iter = join.getKey().getColumnIterator();
keyColumnNames[j] = new String[join.getKey().getColumnSpan()];
int i = 0;
while ( iter.hasNext() ) {
Column col = (Column) iter.next();
for ( Column col : join.getKey().getColumns() ) {
keyColumnNames[j][i++] = col.getQuotedName( dialect );
}
@ -270,11 +268,9 @@ public class SingleTableEntityPersister extends AbstractEntityPersister {
String joinTableName = determineTableName( join.getTable() );
subclassTables.add( joinTableName );
Iterator<Selectable> iter = join.getKey().getColumnIterator();
String[] keyCols = new String[join.getKey().getColumnSpan()];
int i = 0;
while ( iter.hasNext() ) {
Column col = (Column) iter.next();
for ( Column col : join.getKey().getColumns() ) {
keyCols[i++] = col.getQuotedName( dialect );
}
joinKeyColumns.add( keyCols );
@ -297,7 +293,7 @@ public class SingleTableEntityPersister extends AbstractEntityPersister {
throw new MappingException( "discriminator mapping required for single table polymorphic persistence" );
}
forceDiscriminator = persistentClass.isForceDiscriminator();
Selectable selectable = discrimValue.getColumnIterator().next();
Selectable selectable = discrimValue.getSelectables().get(0);
if ( discrimValue.hasFormula() ) {
Formula formula = (Formula) selectable;
discriminatorFormula = formula.getFormula();
@ -371,12 +367,9 @@ public class SingleTableEntityPersister extends AbstractEntityPersister {
// PROPERTIES
propertyTableNumbers = new int[getPropertySpan()];
Iterator<Property> props = persistentClass.getPropertyClosureIterator();
int i = 0;
while ( props.hasNext() ) {
Property prop = props.next();
propertyTableNumbers[i++] = persistentClass.getJoinNumber( prop );
for ( Property property : persistentClass.getPropertyClosure() ) {
propertyTableNumbers[i++] = persistentClass.getJoinNumber( property );
}
//TODO: code duplication with JoinedSubclassEntityPersister
@ -388,22 +381,18 @@ public class SingleTableEntityPersister extends AbstractEntityPersister {
final HashMap<String, Integer> propertyTableNumbersByNameAndSubclassLocal = new HashMap<>();
final Map<Object, String> subclassesByDiscriminatorValueLocal = new HashMap<>();
Iterator<Property> iter = persistentClass.getSubclassPropertyClosureIterator();
while ( iter.hasNext() ) {
Property prop = iter.next();
Integer join = persistentClass.getJoinNumber( prop );
for ( Property property : persistentClass.getSubclassPropertyClosure() ) {
Integer join = persistentClass.getJoinNumber( property );
propertyJoinNumbers.add( join );
//propertyTableNumbersByName.put( prop.getName(), join );
propertyTableNumbersByNameAndSubclassLocal.put(
prop.getPersistentClass().getEntityName() + '.' + prop.getName(),
property.getPersistentClass().getEntityName() + '.' + property.getName(),
join
);
Iterator<Selectable> citer = prop.getColumnIterator();
while ( citer.hasNext() ) {
Selectable thing = citer.next();
if ( thing.isFormula() ) {
for ( Selectable selectable : property.getSelectables() ) {
if ( selectable.isFormula() ) {
formulaJoinedNumbers.add( join );
}
else {

View File

@ -217,9 +217,9 @@ public class UnionSubclassEntityPersister extends AbstractEntityPersister {
final String tableName = determineTableName( tab );
tableNames.add( tableName );
String[] key = new String[idColumnSpan];
Iterator<Column> citer = tab.getPrimaryKey().getColumnIterator();
List<Column> columns = tab.getPrimaryKey().getColumns();
for ( int k = 0; k < idColumnSpan; k++ ) {
key[k] = citer.next().getQuotedName( factory.getJdbcServices().getDialect() );
key[k] = columns.get(k).getQuotedName( factory.getJdbcServices().getDialect() );
}
keyColumns.add( key );
}
@ -473,9 +473,8 @@ public class UnionSubclassEntityPersister extends AbstractEntityPersister {
while ( titer.hasNext() ) {
Table table = titer.next();
if ( !table.isAbstractUnionTable() ) {
Iterator<Column> citer = table.getColumnIterator();
while ( citer.hasNext() ) {
columns.add( citer.next() );
for ( Column column : table.getColumns() ) {
columns.add( column );
}
}
}
@ -483,7 +482,6 @@ public class UnionSubclassEntityPersister extends AbstractEntityPersister {
StringBuilder buf = new StringBuilder()
.append( "( " );
@SuppressWarnings("unchecked")
Iterator<PersistentClass> siter = new JoinedIterator<>(
new SingletonIterator<>( model ),
model.getSubclassIterator()

View File

@ -70,10 +70,8 @@ public final class ProxyFactoryHelper {
}
public static void validateProxyability(final PersistentClass persistentClass) {
Iterator<?> properties = persistentClass.getPropertyIterator();
Class<?> clazz = persistentClass.getMappedClass();
while ( properties.hasNext() ) {
Property property = (Property) properties.next();
for ( Property property : persistentClass.getProperties() ) {
validateGetterSetterMethodProxyability( "Getter", property.getGetter( clazz ).getMethod() );
validateGetterSetterMethodProxyability( "Setter", property.getSetter( clazz ).getMethod() );
}

View File

@ -90,10 +90,10 @@ public class TenantIdBinder implements AttributeBinder<TenantId> {
if ( property.getColumnSpan()!=1 ) {
throw new MappingException("@TenantId attribute must be mapped to a single column or formula");
}
Selectable column = property.getColumnIterator().next();
return column.isFormula()
? ((Formula) column).getFormula()
: ((Column) column).getName();
Selectable selectable = property.getSelectables().get(0);
return selectable.isFormula()
? ((Formula) selectable).getFormula()
: ((Column) selectable).getName();
}
}

View File

@ -154,9 +154,8 @@ public class EntityMetamodel implements Serializable {
if ( identifierMapperComponent != null ) {
nonAggregatedCidMapper = (CompositeType) identifierMapperComponent.getType();
idAttributeNames = new HashSet<>( );
final Iterator<Property> propertyItr = identifierMapperComponent.getPropertyIterator();
while ( propertyItr.hasNext() ) {
idAttributeNames.add( propertyItr.next().getName() );
for ( Property property : identifierMapperComponent.getProperties() ) {
idAttributeNames.add( property.getName() );
}
}
else {
@ -463,10 +462,8 @@ public class EntityMetamodel implements Serializable {
SessionFactoryImplementor sessionFactory,
Component composite,
CompositeGenerationStrategyPairBuilder builder) {
Iterator<?> subProperties = composite.getPropertyIterator();
while ( subProperties.hasNext() ) {
final Property subProperty = (Property) subProperties.next();
builder.addPair( buildGenerationStrategyPair( sessionFactory, subProperty ) );
for ( Property property : composite.getProperties() ) {
builder.addPair( buildGenerationStrategyPair( sessionFactory, property ) );
}
}
@ -616,10 +613,8 @@ public class EntityMetamodel implements Serializable {
// start building the aggregate values
int propertyIndex = -1;
int columnIndex = 0;
Iterator<?> subProperties = composite.getPropertyIterator();
while ( subProperties.hasNext() ) {
for ( Property property : composite.getProperties() ) {
propertyIndex++;
final Property subProperty = (Property) subProperties.next();
final InDatabaseValueGenerationStrategy subStrategy = inDatabaseStrategies.get( propertyIndex );
if ( subStrategy.getGenerationTiming() == GenerationTiming.ALWAYS ) {
@ -632,11 +627,11 @@ public class EntityMetamodel implements Serializable {
referenceColumns = true;
}
if ( subStrategy.getReferencedColumnValues() != null ) {
if ( subStrategy.getReferencedColumnValues().length != subProperty.getColumnSpan() ) {
if ( subStrategy.getReferencedColumnValues().length != property.getColumnSpan() ) {
throw new ValueGenerationStrategyException(
"Internal error : mismatch between number of collected 'referenced column values'" +
" and number of columns for composite attribute : " + mappingProperty.getName() +
'.' + subProperty.getName()
'.' + property.getName()
);
}
System.arraycopy(
@ -644,7 +639,7 @@ public class EntityMetamodel implements Serializable {
0,
columnValues,
columnIndex,
subProperty.getColumnSpan()
property.getColumnSpan()
);
}
}
@ -760,9 +755,8 @@ public class EntityMetamodel implements Serializable {
private void mapPropertyToIndex(Property prop, int i) {
propertyIndexes.put( prop.getName(), i );
if ( prop.getValue() instanceof Component ) {
Iterator<?> iter = ( (Component) prop.getValue() ).getPropertyIterator();
while ( iter.hasNext() ) {
Property subprop = (Property) iter.next();
Component composite = (Component) prop.getValue();
for ( Property subprop : composite.getProperties() ) {
propertyIndexes.put(
prop.getName() + '.' + subprop.getName(),
i

View File

@ -82,10 +82,8 @@ public class ComponentType extends AbstractType implements CompositeTypeImplemen
this.cascade = new CascadeStyle[propertySpan];
this.joinedFetch = new FetchMode[propertySpan];
final Iterator<Property> itr = component.getPropertyIterator();
int i = 0;
while ( itr.hasNext() ) {
final Property property = itr.next();
for ( Property property : component.getProperties() ) {
// todo (6.0) : see if we really need to create these
final StandardProperty prop = PropertyFactory.buildStandardProperty( property, false );
this.propertyNames[i] = prop.getName();

View File

@ -118,7 +118,7 @@ public class EnumType<T extends Enum<T>>
// the `reader != null` block handles annotations, while the `else` block
// handles hbm.xml
if ( reader != null ) {
enumClass = reader.getReturnedClass().asSubclass( Enum.class );
enumClass = (Class<T>) reader.getReturnedClass().asSubclass( Enum.class );
final Long columnLength = reader.getColumnLengths()[0];

View File

@ -73,7 +73,7 @@ public class SerializableToBlobType<T extends Serializable> implements BasicType
ParameterType reader = (ParameterType) parameters.get( PARAMETER_TYPE );
if ( reader != null ) {
@SuppressWarnings("unchecked")
Class<T> returnedClass = reader.getReturnedClass();
Class<T> returnedClass = (Class<T>) reader.getReturnedClass();
setJavaTypeDescriptor( new SerializableJavaType<>(returnedClass) );
}
else {

View File

@ -32,7 +32,7 @@ public interface DynamicParameterizedType extends ParameterizedType {
interface ParameterType {
Class getReturnedClass();
Class<?> getReturnedClass();
Annotation[] getAnnotationsMethod();

View File

@ -32,11 +32,10 @@ import static org.junit.Assert.fail;
*
* @author Hardy Ferentschik
*/
@SuppressWarnings("unchecked")
public class ImmutableTest extends BaseCoreFunctionalTestCase {
@Test
public void testImmutableEntity() throws Exception {
public void testImmutableEntity() {
Session s = openSession();
Transaction tx = s.beginTransaction();
Country country = new Country();
@ -48,7 +47,7 @@ public class ImmutableTest extends BaseCoreFunctionalTestCase {
// try changing the entity
s = openSession();
tx = s.beginTransaction();
Country germany = (Country) s.get(Country.class, country.getId());
Country germany = s.get(Country.class, country.getId());
assertNotNull(germany);
germany.setName("France");
assertEquals("Local name can be changed", "France", germany.getName());
@ -59,7 +58,7 @@ public class ImmutableTest extends BaseCoreFunctionalTestCase {
// retrieving the country again - it should be unmodified
s = openSession();
tx = s.beginTransaction();
germany = (Country) s.get(Country.class, country.getId());
germany = s.get(Country.class, country.getId());
assertNotNull(germany);
assertEquals("Name should not have changed", "Germany", germany.getName());
tx.commit();
@ -70,7 +69,7 @@ public class ImmutableTest extends BaseCoreFunctionalTestCase {
public void testImmutableCollection() {
Country country = new Country();
country.setName("Germany");
List states = new ArrayList<State>();
List<State> states = new ArrayList<>();
State bayern = new State();
bayern.setName("Bayern");
State hessen = new State();
@ -90,7 +89,7 @@ public class ImmutableTest extends BaseCoreFunctionalTestCase {
s = openSession();
tx = s.beginTransaction();
Country germany = (Country) s.get(Country.class, country.getId());
Country germany = s.get(Country.class, country.getId());
assertNotNull(germany);
assertEquals("Wrong number of states", 3, germany.getStates().size());
@ -112,7 +111,7 @@ public class ImmutableTest extends BaseCoreFunctionalTestCase {
s = openSession();
tx = s.beginTransaction();
germany = (Country) s.get(Country.class, country.getId());
germany = s.get(Country.class, country.getId());
assertNotNull(germany);
assertEquals("Wrong number of states", 3, germany.getStates().size());
@ -129,7 +128,7 @@ public class ImmutableTest extends BaseCoreFunctionalTestCase {
s = openSession();
tx = s.beginTransaction();
germany = (Country) s.get(Country.class, country.getId());
germany = s.get(Country.class, country.getId());
assertNotNull(germany);
assertEquals("Wrong number of states", 3, germany.getStates().size());
tx.commit();

View File

@ -22,7 +22,6 @@ import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import org.hibernate.Hibernate;
import org.hibernate.annotations.LazyGroup;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.SessionFactoryBuilder;

View File

@ -108,7 +108,7 @@ import static org.junit.Assert.fail;
@RequiresDialectFeature(DialectChecks.SupportsTemporaryTable.class)
public class ASTParserLoadingTest extends BaseCoreFunctionalTestCase {
private List<Long> createdAnimalIds = new ArrayList<>();
private final List<Long> createdAnimalIds = new ArrayList<>();
@After
public void cleanUpTestData() {

View File

@ -34,7 +34,7 @@ public class SellCarTest extends BaseCoreFunctionalTestCase {
}
@Test
public void testSellCar() throws Exception {
public void testSellCar() {
prepareData();
Session session = openSession();
Transaction tx = session.beginTransaction();
@ -54,7 +54,6 @@ public class SellCarTest extends BaseCoreFunctionalTestCase {
session.close();
}
@SuppressWarnings( {"unchecked"})
private Object createData() {
Seller stliu = new Seller();
stliu.setId( createID( "stliu" ) );
@ -69,7 +68,7 @@ public class SellCarTest extends BaseCoreFunctionalTestCase {
private PersonID createID( String name ) {
PersonID id = new PersonID();
id.setName( name );
id.setNum( Long.valueOf( 100 ) );
id.setNum(100L);
return id;
}
}