diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java index 220b3bb887..bc88549c93 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java @@ -254,6 +254,14 @@ public abstract class CollectionBinder { this.buildingContext = buildingContext; } + private String getRole() { + return collection.getRole(); + } + + private InFlightMetadataCollector getMetadataCollector() { + return buildingContext.getMetadataCollector(); + } + /** * The first pass at binding a collection. */ @@ -859,7 +867,9 @@ public abstract class CollectionBinder { MetadataBuildingContext buildingContext) { final CollectionBinder binder; - final CollectionType typeAnnotation = property.getAnnotationUsage( CollectionType.class, buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); + final CollectionType typeAnnotation = + property.getAnnotationUsage( CollectionType.class, + buildingContext.getMetadataCollector().getSourceModelBuildingContext() ); if ( typeAnnotation != null ) { binder = createBinderFromCustomTypeAnnotation( property, typeAnnotation, buildingContext ); // todo (6.0) - technically, these should no longer be needed @@ -1174,8 +1184,8 @@ public abstract class CollectionBinder { } public void setTargetEntity(Class targetEntity) { - final SourceModelBuildingContext sourceModelContext = buildingContext.getMetadataCollector().getSourceModelBuildingContext(); - final ClassDetailsRegistry classDetailsRegistry = sourceModelContext.getClassDetailsRegistry(); + final ClassDetailsRegistry classDetailsRegistry = + getMetadataCollector().getSourceModelBuildingContext().getClassDetailsRegistry(); setTargetEntity( classDetailsRegistry.resolveClassDetails( targetEntity.getName() ) ); } @@ -1225,7 +1235,7 @@ public abstract class CollectionBinder { //TODO reduce tableBinder != null and oneToMany scheduleSecondPass( isUnowned ); - buildingContext.getMetadataCollector().addCollectionBinding( collection ); + getMetadataCollector().addCollectionBinding( collection ); bindProperty(); } @@ -1245,7 +1255,7 @@ public abstract class CollectionBinder { } private void scheduleSecondPass(boolean isMappedBy) { - final InFlightMetadataCollector metadataCollector = buildingContext.getMetadataCollector(); + final InFlightMetadataCollector metadataCollector = getMetadataCollector(); //many to many may need some second pass information if ( !oneToMany && isMappedBy ) { metadataCollector.addMappedBy( getElementType().getName(), mappedBy, propertyName ); @@ -1274,7 +1284,7 @@ public abstract class CollectionBinder { private void bindExplicitTypes() { // set explicit type information - final InFlightMetadataCollector metadataCollector = buildingContext.getMetadataCollector(); + final InFlightMetadataCollector metadataCollector = getMetadataCollector(); if ( explicitType != null ) { final TypeDefinition typeDef = metadataCollector.getTypeDefinition( explicitType ); if ( typeDef == null ) { @@ -1402,7 +1412,7 @@ public abstract class CollectionBinder { final SQLSelect sqlSelect = property.getDirectAnnotationUsage( SQLSelect.class ); if ( sqlSelect != null ) { - final String loaderName = collection.getRole() + "$SQLSelect"; + final String loaderName = getRole() + "$SQLSelect"; collection.setLoaderName( loaderName ); // TODO: pass in the collection element type here QueryBinder.bindNativeQuery( loaderName, sqlSelect, null, buildingContext ); @@ -1410,7 +1420,7 @@ public abstract class CollectionBinder { final HQLSelect hqlSelect = property.getDirectAnnotationUsage( HQLSelect.class ); if ( hqlSelect != null ) { - final String loaderName = collection.getRole() + "$HQLSelect"; + final String loaderName = getRole() + "$HQLSelect"; collection.setLoaderName( loaderName ); QueryBinder.bindQuery( loaderName, hqlSelect, buildingContext ); } @@ -1517,12 +1527,12 @@ public abstract class CollectionBinder { } private SourceModelBuildingContext sourceModelContext() { - return buildingContext.getMetadataCollector().getSourceModelBuildingContext(); + return getMetadataCollector().getSourceModelBuildingContext(); } private void handleFetchProfileOverrides() { property.forEachAnnotationUsage( FetchProfileOverride.class, sourceModelContext(), (usage) -> { - buildingContext.getMetadataCollector().addSecondPass( new FetchSecondPass( + getMetadataCollector().addSecondPass( new FetchSecondPass( usage, propertyHolder, propertyName, @@ -1702,7 +1712,7 @@ public abstract class CollectionBinder { } oneToMany.setAssociatedClass( associatedClass ); - final Map joins = buildingContext.getMetadataCollector().getJoins( referencedEntityName ); + final Map joins = getMetadataCollector().getJoins( referencedEntityName ); foreignJoinColumns.setPropertyHolder( buildPropertyHolder( associatedClass, joins, @@ -1717,7 +1727,7 @@ public abstract class CollectionBinder { collection.setCollectionTable( foreignJoinColumns.getTable() ); } if ( LOG.isDebugEnabled() ) { - LOG.debugf( "Mapping collection: %s -> %s", collection.getRole(), collection.getCollectionTable().getName() ); + LOG.debugf( "Mapping collection: %s -> %s", getRole(), collection.getCollectionTable().getName() ); } bindSynchronize(); @@ -1733,7 +1743,7 @@ public abstract class CollectionBinder { } private void createOneToManyBackref(org.hibernate.mapping.OneToMany oneToMany) { - final InFlightMetadataCollector collector = buildingContext.getMetadataCollector(); + final InFlightMetadataCollector collector = getMetadataCollector(); // for non-inverse one-to-many, with a not-null fk, add a backref! final String entityName = oneToMany.getReferencedEntityName(); final PersistentClass referenced = collector.getEntityBinding( entityName ); @@ -1745,15 +1755,16 @@ public abstract class CollectionBinder { backref.setOptional( true ); backref.setUpdateable( false); backref.setSelectable( false ); - backref.setCollectionRole( collection.getRole() ); + backref.setCollectionRole( getRole() ); backref.setEntityName( collection.getOwner().getEntityName() ); backref.setValue( collection.getKey() ); referenced.addProperty( backref ); } private void handleJpaOrderBy(Collection collection, PersistentClass associatedClass) { - if ( jpaOrderBy != null ) { - final String orderByFragment = buildOrderByClauseFromHql( jpaOrderBy.value(), associatedClass ); + final String hqlOrderBy = extractHqlOrderBy( jpaOrderBy ); + if ( hqlOrderBy != null ) { + final String orderByFragment = buildOrderByClauseFromHql( hqlOrderBy, associatedClass ); if ( isNotEmpty( orderByFragment ) ) { collection.setOrderBy( orderByFragment ); } @@ -1763,22 +1774,20 @@ public abstract class CollectionBinder { private void bindSynchronize() { final Synchronize synchronizeAnnotation = property.getDirectAnnotationUsage( Synchronize.class ); if ( synchronizeAnnotation != null ) { - final JdbcEnvironment jdbcEnvironment = buildingContext.getMetadataCollector().getDatabase().getJdbcEnvironment(); for ( String table : synchronizeAnnotation.value() ) { - String physicalName = synchronizeAnnotation.logical() - ? toPhysicalName( jdbcEnvironment, table ) - : table; + final String physicalName = + synchronizeAnnotation.logical() + ? toPhysicalName( table ) + : table; collection.addSynchronizedTable( physicalName ); } } } - private String toPhysicalName(JdbcEnvironment jdbcEnvironment, String logicalName) { + private String toPhysicalName(String logicalName) { + final JdbcEnvironment jdbcEnvironment = getMetadataCollector().getDatabase().getJdbcEnvironment(); return buildingContext.getBuildingOptions().getPhysicalNamingStrategy() - .toPhysicalTableName( - jdbcEnvironment.getIdentifierHelper().toIdentifier( logicalName ), - jdbcEnvironment - ) + .toPhysicalTableName( jdbcEnvironment.getIdentifierHelper().toIdentifier( logicalName ), jdbcEnvironment ) .render( jdbcEnvironment.getDialect() ); } @@ -1863,7 +1872,8 @@ public abstract class CollectionBinder { } private String getWhereJoinTableClause() { - final SQLJoinTableRestriction joinTableRestriction = property.getDirectAnnotationUsage( SQLJoinTableRestriction.class ); + final SQLJoinTableRestriction joinTableRestriction = + property.getDirectAnnotationUsage( SQLJoinTableRestriction.class ); return joinTableRestriction != null ? joinTableRestriction.value() : null; } @@ -1878,7 +1888,8 @@ public abstract class CollectionBinder { } private String getWhereOnCollectionClause() { - final SQLRestriction restrictionOnCollection = getOverridableAnnotation( property, SQLRestriction.class, getBuildingContext() ); + final SQLRestriction restrictionOnCollection = + getOverridableAnnotation( property, SQLRestriction.class, getBuildingContext() ); return restrictionOnCollection != null ? restrictionOnCollection.value() : null; } @@ -1939,7 +1950,7 @@ public abstract class CollectionBinder { } private String getDefaultFilterCondition(String name, Annotation annotation) { - final FilterDefinition definition = buildingContext.getMetadataCollector().getFilterDefinition( name ); + final FilterDefinition definition = getMetadataCollector().getFilterDefinition( name ); if ( definition == null ) { throw new AnnotationException( "Collection '" + qualify( propertyHolder.getPath(), propertyName ) + "' has a '@" + annotation.annotationType().getSimpleName() @@ -1981,6 +1992,7 @@ public abstract class CollectionBinder { public void setMapKey(MapKey key) { hasMapKeyProperty = key != null; if ( hasMapKeyProperty ) { + // JPA says: if missing, use primary key of associated entity mapKeyPropertyName = nullIfEmpty( key.name() ); } } @@ -2167,7 +2179,7 @@ public abstract class CollectionBinder { final String entityName = joinColumns.getManyToManyOwnerSideEntityName() != null ? "inverse__" + joinColumns.getManyToManyOwnerSideEntityName() : joinColumns.getPropertyHolder().getEntityName(); - final InFlightMetadataCollector collector = buildingContext.getMetadataCollector(); + final InFlightMetadataCollector collector = getMetadataCollector(); final String referencedProperty = collector.getPropertyReferencedAssociation( entityName, mappedBy ); if ( referencedProperty != null ) { collection.setReferencedPropertyName( referencedProperty ); @@ -2238,14 +2250,8 @@ public abstract class CollectionBinder { propertyHolder.startingProperty( property ); } - final CollectionPropertyHolder holder = buildPropertyHolder( - collection, - collection.getRole(), - elementClass, - property, - propertyHolder, - buildingContext - ); + final CollectionPropertyHolder holder = + buildPropertyHolder( collection, getRole(), elementClass, property, propertyHolder, buildingContext ); final Class> compositeUserType = resolveCompositeUserType( property, elementClass, buildingContext ); @@ -2370,13 +2376,13 @@ public abstract class CollectionBinder { // todo : force in the case of Convert annotation(s) with embedded paths (beyond key/value prefixes)? return isEmbedded || attributeOverride ? EMBEDDABLE - : buildingContext.getMetadataCollector().getClassType( elementClass ); + : getMetadataCollector().getClassType( elementClass ); } } protected boolean mappingDefinedAttributeOverrideOnElement(MemberDetails property) { return property.hasDirectAnnotationUsage( AttributeOverride.class ) - || property.hasDirectAnnotationUsage( AttributeOverrides.class ); + || property.hasDirectAnnotationUsage( AttributeOverrides.class ); } static AnnotatedColumns createElementColumnsIfNecessary( @@ -2516,7 +2522,7 @@ public abstract class CollectionBinder { private void handleOwnedManyToMany(PersistentClass collectionEntity, boolean isCollectionOfEntities) { //TODO: only for implicit columns? //FIXME NamingStrategy - final InFlightMetadataCollector collector = buildingContext.getMetadataCollector(); + final InFlightMetadataCollector collector = getMetadataCollector(); final PersistentClass owner = collection.getOwner(); joinColumns.setMappedBy( owner.getEntityName(), @@ -2616,11 +2622,12 @@ public abstract class CollectionBinder { + "' which does not exist in the target entity '" + elementType.getName() + "'" ); } final Value otherSidePropertyValue = otherSideProperty.getValue(); - final Table table = otherSidePropertyValue instanceof Collection - // this is a collection on the other side - ? ( (Collection) otherSidePropertyValue ).getCollectionTable() - // this is a ToOne with a @JoinTable or a regular property - : otherSidePropertyValue.getTable(); + final Table table = + otherSidePropertyValue instanceof Collection collectionProperty + // this is a collection on the other side + ? collectionProperty.getCollectionTable() + // this is a ToOne with a @JoinTable or a regular property + : otherSidePropertyValue.getTable(); collection.setCollectionTable( table ); processSoftDeletes(); @@ -2666,7 +2673,7 @@ public abstract class CollectionBinder { return " targets the type '" + elementType.getName() + "'" + problem; } - private Class resolveCustomInstantiator( + private static Class resolveCustomInstantiator( MemberDetails property, TypeDetails propertyClass, MetadataBuildingContext context) { @@ -2710,15 +2717,12 @@ public abstract class CollectionBinder { return null; } - private String extractHqlOrderBy(OrderBy jpaOrderBy) { - if ( jpaOrderBy != null ) { - // Null not possible. In case of empty expression, apply default ordering. - return jpaOrderBy.value(); - } - else { - // @OrderBy not found. - return null; - } + private static String extractHqlOrderBy(OrderBy jpaOrderBy) { + return jpaOrderBy != null + // Null not possible. In case of empty expression, apply default ordering. + ? jpaOrderBy.value() + // @OrderBy not found. + : null; } private static void checkFilterConditions(Collection collection) { @@ -2859,21 +2863,22 @@ public abstract class CollectionBinder { for ( Selectable selectable: mappedByColumns ) { firstColumn.linkValueUsingAColumnCopy( (Column) selectable, value); } - final String referencedPropertyName = buildingContext.getMetadataCollector() - .getPropertyReferencedAssociation( targetEntity.getEntityName(), mappedBy ); + final InFlightMetadataCollector metadataCollector = getMetadataCollector(); + final String referencedPropertyName = + metadataCollector.getPropertyReferencedAssociation( targetEntity.getEntityName(), mappedBy ); + final ManyToOne manyToOne = (ManyToOne) value; if ( referencedPropertyName != null ) { //TODO always a many to one? - ( (ManyToOne) value).setReferencedPropertyName( referencedPropertyName ); - buildingContext.getMetadataCollector() - .addUniquePropertyReference( targetEntity.getEntityName(), referencedPropertyName ); + manyToOne.setReferencedPropertyName( referencedPropertyName ); + metadataCollector.addUniquePropertyReference( targetEntity.getEntityName(), referencedPropertyName ); } - ( (ManyToOne) value).setReferenceToPrimaryKey( referencedPropertyName == null ); + manyToOne.setReferenceToPrimaryKey( referencedPropertyName == null ); value.createForeignKey(); } private static List mappedByColumns(PersistentClass referencedEntity, Property property) { - if ( property.getValue() instanceof Collection ) { - return ( (Collection) property.getValue() ).getKey().getSelectables(); + if ( property.getValue() instanceof Collection collection ) { + return collection.getKey().getSelectables(); } else { //find the appropriate reference key, can be in a join diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java index fce04fc42a..f23b42e577 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java @@ -201,7 +201,11 @@ public class EntityBinder { private CacheLayout queryCacheLayout; private SourceModelBuildingContext getSourceModelContext() { - return context.getMetadataCollector().getSourceModelBuildingContext(); + return getMetadataCollector().getSourceModelBuildingContext(); + } + + private InFlightMetadataCollector getMetadataCollector() { + return context.getMetadataCollector(); } /** @@ -215,12 +219,14 @@ public class EntityBinder { LOG.debugf( "Binding entity from annotated class: %s", clazzToProcess.getName() ); } + final InFlightMetadataCollector collector = context.getMetadataCollector(); + //TODO: be more strict with secondary table allowance (not for ids, not for secondary table join columns etc) final InheritanceState inheritanceState = inheritanceStates.get( clazzToProcess ); final PersistentClass superEntity = getSuperEntity( clazzToProcess, inheritanceStates, context, inheritanceState ); final PersistentClass persistentClass = makePersistentClass( inheritanceState, superEntity, context ); - checkOverrides( clazzToProcess, superEntity, context.getMetadataCollector().getSourceModelBuildingContext() ); + checkOverrides( clazzToProcess, superEntity, collector.getSourceModelBuildingContext() ); final EntityBinder entityBinder = new EntityBinder( clazzToProcess, persistentClass, context ); entityBinder.bindEntity(); @@ -240,7 +246,6 @@ public class EntityBinder { entityBinder.handleInheritance( inheritanceState, superEntity, holder ); entityBinder.handleIdentifier( holder, inheritanceStates, inheritanceState ); - final InFlightMetadataCollector collector = context.getMetadataCollector(); if ( persistentClass instanceof RootClass rootClass ) { collector.addSecondPass( new CreateKeySecondPass( rootClass ) ); bindSoftDelete( clazzToProcess, rootClass, context ); @@ -327,7 +332,8 @@ public class EntityBinder { ClassDetails classToCheck = classDetails.getSuperClass(); while ( classToCheck != null ) { final SoftDelete fromSuper = classToCheck.getAnnotationUsage( SoftDelete.class, sourceModelContext ); - if ( fromSuper != null && classToCheck.hasAnnotationUsage( jakarta.persistence.MappedSuperclass.class, sourceModelContext ) ) { + if ( fromSuper != null + && classToCheck.hasAnnotationUsage( jakarta.persistence.MappedSuperclass.class, sourceModelContext ) ) { return fromSuper; } @@ -366,7 +372,8 @@ public class EntityBinder { } private void callTypeBinders(PersistentClass persistentClass) { - final List metaAnnotatedList = annotatedClass.getMetaAnnotated( TypeBinderType.class, getSourceModelContext() ); + final List metaAnnotatedList = + annotatedClass.getMetaAnnotated( TypeBinderType.class, getSourceModelContext() ); for ( Annotation metaAnnotated : metaAnnotatedList ) { applyTypeBinder( metaAnnotated, persistentClass ); } @@ -424,9 +431,8 @@ public class EntityBinder { TableBinder.addTableOptions( table, jpaTableUsage.options() ); } - final InFlightMetadataCollector.EntityTableXref entityTableXref = context - .getMetadataCollector() - .getEntityTableXref( persistentClass.getEntityName() ); + final InFlightMetadataCollector.EntityTableXref entityTableXref = + getMetadataCollector().getEntityTableXref( persistentClass.getEntityName() ); annotatedClass.forEachAnnotationUsage( jakarta.persistence.SecondaryTable.class, getSourceModelContext(), (usage) -> { final Identifier secondaryTableLogicalName = toIdentifier( usage.name() ); @@ -476,7 +482,9 @@ public class EntityBinder { if ( classWithIdClass != null ) { final IdClass idClassAnn = classWithIdClass.getDirectAnnotationUsage( IdClass.class ); final Class idClassValue = idClassAnn.value(); - final ClassDetails compositeClass = context.getMetadataCollector().getSourceModelBuildingContext().getClassDetailsRegistry().resolveClassDetails( idClassValue.getName() ); + final ClassDetails compositeClass = + getMetadataCollector().getSourceModelBuildingContext().getClassDetailsRegistry() + .resolveClassDetails( idClassValue.getName() ); final TypeDetails compositeType = new ClassTypeDetailsImpl( compositeClass, TypeDetails.Kind.CLASS ); final TypeDetails classWithIdType = new ClassTypeDetailsImpl( classWithIdClass, TypeDetails.Kind.CLASS ); @@ -657,7 +665,8 @@ public class EntityBinder { } else { - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext sourceModelContext = + context.getMetadataCollector().getSourceModelBuildingContext(); final IdClass idClass = associatedClassWithIdClass.getAnnotationUsage( IdClass.class, sourceModelContext ); return compositeClass.getName().equals( idClass.value().getName() ); } @@ -731,7 +740,8 @@ public class EntityBinder { final String table; final String catalog; final UniqueConstraint[] uniqueConstraints; - final jakarta.persistence.Table tableAnnotation = annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class, getSourceModelContext() ); + final jakarta.persistence.Table tableAnnotation = + annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class, getSourceModelContext() ); if ( tableAnnotation != null ) { table = tableAnnotation.name(); schema = tableAnnotation.schema(); @@ -778,7 +788,7 @@ public class EntityBinder { rowId == null ? null : rowId.value(), view == null ? null : view.query(), inheritanceState.hasDenormalizedTable() - ? context.getMetadataCollector().getEntityTableXref( superEntity.getEntityName() ) + ? getMetadataCollector().getEntityTableXref( superEntity.getEntityName() ) : null ); } @@ -838,10 +848,9 @@ public class EntityBinder { final OnDelete onDelete = annotatedClass.getAnnotationUsage( OnDelete.class, getSourceModelContext() ); key.setOnDeleteAction( onDelete == null ? null : onDelete.action() ); //we are never in a second pass at that stage, so queue it - context.getMetadataCollector() - .addSecondPass( new JoinedSubclassFkSecondPass( jsc, joinColumns, key, context) ); - context.getMetadataCollector() - .addSecondPass( new CreateKeySecondPass( jsc ) ); + final InFlightMetadataCollector metadataCollector = getMetadataCollector(); + metadataCollector.addSecondPass( new JoinedSubclassFkSecondPass( jsc, joinColumns, key, context) ); + metadataCollector.addSecondPass( new CreateKeySecondPass( jsc ) ); } final AnnotatedDiscriminatorColumn discriminatorColumn = processJoinedDiscriminatorProperties( state ); @@ -936,8 +945,7 @@ public class EntityBinder { rootClass.setPolymorphic( true ); final String rootEntityName = rootClass.getEntityName(); LOG.tracev( "Setting discriminator for entity {0}", rootEntityName); - context.getMetadataCollector() - .addSecondPass( new NullableDiscriminatorColumnSecondPass( rootEntityName ) ); + getMetadataCollector().addSecondPass( new NullableDiscriminatorColumnSecondPass( rootEntityName ) ); } } @@ -945,10 +953,13 @@ public class EntityBinder { * Process all discriminator-related metadata per rules for "single table" inheritance */ private AnnotatedDiscriminatorColumn processSingleTableDiscriminatorProperties(InheritanceState inheritanceState) { - final DiscriminatorColumn discriminatorColumn = annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, getSourceModelContext() ); - final DiscriminatorFormula discriminatorFormula = getOverridableAnnotation( annotatedClass, DiscriminatorFormula.class, context ); + final DiscriminatorColumn discriminatorColumn = + annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, getSourceModelContext() ); + final DiscriminatorFormula discriminatorFormula = + getOverridableAnnotation( annotatedClass, DiscriminatorFormula.class, context ); - if ( !inheritanceState.hasParents() || annotatedClass.hasAnnotationUsage( Inheritance.class, getSourceModelContext() ) ) { + if ( !inheritanceState.hasParents() + || annotatedClass.hasAnnotationUsage( Inheritance.class, getSourceModelContext() ) ) { return buildDiscriminatorColumn( discriminatorColumn, discriminatorFormula, @@ -982,8 +993,10 @@ public class EntityBinder { + "' has 'JOINED' inheritance and is annotated '@DiscriminatorFormula'" ); } - final DiscriminatorColumn discriminatorColumn = annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, getSourceModelContext() ); - if ( !inheritanceState.hasParents() || annotatedClass.hasAnnotationUsage( Inheritance.class, getSourceModelContext() ) ) { + final DiscriminatorColumn discriminatorColumn = + annotatedClass.getAnnotationUsage( DiscriminatorColumn.class, getSourceModelContext() ); + if ( !inheritanceState.hasParents() + || annotatedClass.hasAnnotationUsage( Inheritance.class, getSourceModelContext() ) ) { return useDiscriminatorColumnForJoined( discriminatorColumn ) ? buildDiscriminatorColumn( discriminatorColumn, null, null, DEFAULT_DISCRIMINATOR_COLUMN_NAME, context ) : null; @@ -1009,14 +1022,14 @@ public class EntityBinder { */ private boolean useDiscriminatorColumnForJoined(DiscriminatorColumn discriminatorColumn) { if ( discriminatorColumn != null ) { - boolean ignore = context.getBuildingOptions().ignoreExplicitDiscriminatorsForJoinedInheritance(); + final boolean ignore = context.getBuildingOptions().ignoreExplicitDiscriminatorsForJoinedInheritance(); if ( ignore ) { LOG.debugf( "Ignoring explicit @DiscriminatorColumn annotation on: %s", annotatedClass.getName() ); } return !ignore; } else { - boolean createImplicit = context.getBuildingOptions().createImplicitDiscriminatorsForJoinedInheritance(); + final boolean createImplicit = context.getBuildingOptions().createImplicitDiscriminatorsForJoinedInheritance(); if ( createImplicit ) { LOG.debugf( "Inferring implicit @DiscriminatorColumn using defaults for: %s", annotatedClass.getName() ); } @@ -1121,9 +1134,11 @@ public class EntityBinder { final AnnotatedJoinColumns joinColumns = new AnnotatedJoinColumns(); joinColumns.setBuildingContext( context ); - final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext(); + final SourceModelBuildingContext sourceModelContext = + context.getMetadataCollector().getSourceModelBuildingContext(); - final PrimaryKeyJoinColumns primaryKeyJoinColumns = clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumns.class, sourceModelContext ); + final PrimaryKeyJoinColumns primaryKeyJoinColumns = + clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumns.class, sourceModelContext ); if ( primaryKeyJoinColumns != null ) { final PrimaryKeyJoinColumn[] columns = primaryKeyJoinColumns.value(); if ( !ArrayHelper.isEmpty( columns ) ) { @@ -1138,7 +1153,8 @@ public class EntityBinder { } } else { - final PrimaryKeyJoinColumn columnAnnotation = clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumn.class, sourceModelContext ); + final PrimaryKeyJoinColumn columnAnnotation = + clazzToProcess.getAnnotationUsage( PrimaryKeyJoinColumn.class, sourceModelContext ); buildInheritanceJoinColumn( columnAnnotation, null, @@ -1171,8 +1187,9 @@ public class EntityBinder { return null; } else { - final PersistentClass superEntity = context.getMetadataCollector() - .getEntityBinding( superState.getClassDetails().getName() ); + final PersistentClass superEntity = + context.getMetadataCollector() + .getEntityBinding( superState.getClassDetails().getName() ); //check if superclass is not a potential persistent class if ( superEntity == null && inheritanceState.hasParents() ) { throw new AssertionFailure( "Subclass has to be bound after its parent class: " @@ -1185,7 +1202,8 @@ public class EntityBinder { /** * See {@link JpaEventListener} for a better (?) alternative */ - private static void bindCallbacks(ClassDetails entityClass, PersistentClass persistentClass, MetadataBuildingContext context) { + private static void bindCallbacks( + ClassDetails entityClass, PersistentClass persistentClass, MetadataBuildingContext context) { for ( CallbackType callbackType : CallbackType.values() ) { persistentClass.addCallbackDefinitions( CallbackDefinitionResolver.resolveEntityCallbacks( context, @@ -1249,22 +1267,27 @@ public class EntityBinder { } private void bindRowManagement() { - final DynamicInsert dynamicInsertAnn = annotatedClass.getAnnotationUsage( DynamicInsert.class, getSourceModelContext() ); + final DynamicInsert dynamicInsertAnn = + annotatedClass.getAnnotationUsage( DynamicInsert.class, getSourceModelContext() ); persistentClass.setDynamicInsert( dynamicInsertAnn != null ); - final DynamicUpdate dynamicUpdateAnn = annotatedClass.getAnnotationUsage( DynamicUpdate.class, getSourceModelContext() ); + final DynamicUpdate dynamicUpdateAnn = + annotatedClass.getAnnotationUsage( DynamicUpdate.class, getSourceModelContext() ); persistentClass.setDynamicUpdate( dynamicUpdateAnn != null ); - if ( persistentClass.useDynamicInsert() && annotatedClass.hasAnnotationUsage( SQLInsert.class, getSourceModelContext() ) ) { + if ( persistentClass.useDynamicInsert() + && annotatedClass.hasAnnotationUsage( SQLInsert.class, getSourceModelContext() ) ) { throw new AnnotationException( "Entity '" + name + "' is annotated both '@DynamicInsert' and '@SQLInsert'" ); } - if ( persistentClass.useDynamicUpdate() && annotatedClass.hasAnnotationUsage( SQLUpdate.class, getSourceModelContext() ) ) { + if ( persistentClass.useDynamicUpdate() + && annotatedClass.hasAnnotationUsage( SQLUpdate.class, getSourceModelContext() ) ) { throw new AnnotationException( "Entity '" + name + "' is annotated both '@DynamicUpdate' and '@SQLUpdate'" ); } } private void bindOptimisticLocking() { - final OptimisticLocking optimisticLockingAnn = annotatedClass.getAnnotationUsage( OptimisticLocking.class, getSourceModelContext() ); + final OptimisticLocking optimisticLockingAnn = + annotatedClass.getAnnotationUsage( OptimisticLocking.class, getSourceModelContext() ); persistentClass.setOptimisticLockStyle( fromLockType( optimisticLockingAnn == null ? OptimisticLockType.VERSION : optimisticLockingAnn.type() ) ); @@ -1347,10 +1370,11 @@ public class EntityBinder { private void registerImportName() { LOG.debugf( "Import with entity name %s", name ); try { - context.getMetadataCollector().addImport( name, persistentClass.getEntityName() ); + final InFlightMetadataCollector metadataCollector = getMetadataCollector(); + metadataCollector.addImport( name, persistentClass.getEntityName() ); final String entityName = persistentClass.getEntityName(); if ( !entityName.equals( name ) ) { - context.getMetadataCollector().addImport( entityName, entityName ); + metadataCollector.addImport( entityName, entityName ); } } catch (MappingException me) { @@ -1461,12 +1485,10 @@ public class EntityBinder { // - if so, we return the matched override // - if not, we return the normal SQLInsert (if one) final Class overrideAnnotation = getOverrideAnnotation( annotationType ); - final Annotation[] dialectOverrides = annotatedClass.getRepeatedAnnotationUsages( - overrideAnnotation, - getSourceModelContext() - ); + final Annotation[] dialectOverrides = + annotatedClass.getRepeatedAnnotationUsages( overrideAnnotation, getSourceModelContext() ); if ( isNotEmpty( dialectOverrides ) ) { - final Dialect dialect = context.getMetadataCollector().getDatabase().getDialect(); + final Dialect dialect = getMetadataCollector().getDatabase().getDialect(); for ( int i = 0; i < dialectOverrides.length; i++ ) { //noinspection unchecked final DialectOverrider dialectOverride = (DialectOverrider) dialectOverrides[i]; @@ -1507,7 +1529,7 @@ public class EntityBinder { } private String getDefaultFilterCondition(String filterName) { - final FilterDefinition definition = context.getMetadataCollector().getFilterDefinition( filterName ); + final FilterDefinition definition = getMetadataCollector().getFilterDefinition( filterName ); if ( definition == null ) { throw new AnnotationException( "Entity '" + name + "' has a '@Filter' for an undefined filter named '" + filterName + "'" ); @@ -1523,16 +1545,14 @@ public class EntityBinder { private void bindSynchronize() { final Synchronize synchronize = annotatedClass.getAnnotationUsage( Synchronize.class, getSourceModelContext() ); - if ( synchronize == null ) { - return; - } - - final JdbcEnvironment jdbcEnvironment = context.getMetadataCollector().getDatabase().getJdbcEnvironment(); - final boolean logical = synchronize.logical(); - final String[] tableNames = synchronize.value(); - for ( String tableName : tableNames ) { - String physicalName = logical ? toPhysicalName( jdbcEnvironment, tableName ) : tableName; - persistentClass.addSynchronizedTable( physicalName ); + if ( synchronize != null ) { + final JdbcEnvironment jdbcEnvironment = getMetadataCollector().getDatabase().getJdbcEnvironment(); + final boolean logical = synchronize.logical(); + final String[] tableNames = synchronize.value(); + for ( String tableName : tableNames ) { + final String physicalName = logical ? toPhysicalName( jdbcEnvironment, tableName ) : tableName; + persistentClass.addSynchronizedTable( physicalName ); + } } } @@ -1553,16 +1573,16 @@ public class EntityBinder { } private void processNamedEntityGraph(NamedEntityGraph annotation) { - if ( annotation == null ) { - return; + if ( annotation != null ) { + getMetadataCollector() + .addNamedEntityGraph( new NamedEntityGraphDefinition( annotation, name, + persistentClass.getEntityName() ) ); } - context.getMetadataCollector().addNamedEntityGraph( - new NamedEntityGraphDefinition( annotation, name, persistentClass.getEntityName() ) - ); } public void bindDiscriminatorValue() { - final DiscriminatorValue discriminatorValueAnn = annotatedClass.getAnnotationUsage( DiscriminatorValue.class, getSourceModelContext() ); + final DiscriminatorValue discriminatorValueAnn = + annotatedClass.getAnnotationUsage( DiscriminatorValue.class, getSourceModelContext() ); final String discriminatorValue = discriminatorValueAnn != null ? discriminatorValueAnn.value() : null; @@ -1594,7 +1614,8 @@ public class EntityBinder { } public void bindConcreteProxy() { - final ConcreteProxy annotationUsage = annotatedClass.getAnnotationUsage( ConcreteProxy.class, getSourceModelContext() ); + final ConcreteProxy annotationUsage = + annotatedClass.getAnnotationUsage( ConcreteProxy.class, getSourceModelContext() ); if ( annotationUsage != null ) { if ( persistentClass.getSuperclass() != null ) { throw new AnnotationException( "Entity class '" + persistentClass.getClassName() @@ -1617,7 +1638,8 @@ public class EntityBinder { private void bindNaturalIdCache() { naturalIdCacheRegion = null; - final NaturalIdCache naturalIdCacheAnn = annotatedClass.getAnnotationUsage( NaturalIdCache.class, getSourceModelContext() ); + final NaturalIdCache naturalIdCacheAnn = + annotatedClass.getAnnotationUsage( NaturalIdCache.class, getSourceModelContext() ); if ( naturalIdCacheAnn == null ) { return; } @@ -1686,7 +1708,8 @@ public class EntityBinder { cacheRegion = effectiveCache.region(); cacheLazyProperty = isCacheLazy( effectiveCache, annotatedClass ); - final QueryCacheLayout queryCache = annotatedClass.getAnnotationUsage( QueryCacheLayout.class, getSourceModelContext() ); + final QueryCacheLayout queryCache = + annotatedClass.getAnnotationUsage( QueryCacheLayout.class, getSourceModelContext() ); queryCacheLayout = queryCache == null ? null : queryCache.layout(); } @@ -1722,7 +1745,8 @@ public class EntityBinder { } private static Cache buildCacheMock(ClassDetails classDetails, MetadataBuildingContext context) { - final CacheAnnotation cacheUsage = HibernateAnnotations.CACHE.createUsage( context.getMetadataCollector().getSourceModelBuildingContext() ); + final CacheAnnotation cacheUsage = + HibernateAnnotations.CACHE.createUsage( context.getMetadataCollector().getSourceModelBuildingContext() ); cacheUsage.region( classDetails.getName() ); cacheUsage.usage( determineCacheConcurrencyStrategy( context ) ); return cacheUsage; @@ -1802,7 +1826,7 @@ public class EntityBinder { ); } - final InFlightMetadataCollector collector = context.getMetadataCollector(); + final InFlightMetadataCollector collector = getMetadataCollector(); final InFlightMetadataCollector.EntityTableXref superTableXref = collector.getEntityTableXref( entityName ); final Table primaryTable = superTableXref.getPrimaryTable(); @@ -1851,12 +1875,11 @@ public class EntityBinder { // table.setComment( comment.value() ); // } - context.getMetadataCollector() - .addEntityTableXref( entityName, logicalName, table, denormalizedSuperTableXref ); + getMetadataCollector().addEntityTableXref( entityName, logicalName, table, denormalizedSuperTableXref ); - if ( persistentClass instanceof TableOwner ) { + if ( persistentClass instanceof TableOwner tableOwner ) { LOG.debugf( "Bind entity %s on table %s", entityName, table.getName() ); - ( (TableOwner) persistentClass ).setTable( table ); + tableOwner.setTable( table ); } else { throw new AssertionFailure( "binding a table for a subclass" ); @@ -2109,11 +2132,8 @@ public class EntityBinder { return new QualifiedTableName( toIdentifier( catalog ), toIdentifier( schema ), - context.getMetadataCollector() - .getDatabase() - .getJdbcEnvironment() - .getIdentifierHelper() - .toIdentifier( name ) + getMetadataCollector().getDatabase().getJdbcEnvironment() + .getIdentifierHelper().toIdentifier( name ) ); } @@ -2129,7 +2149,7 @@ public class EntityBinder { final String entityName = persistentClass.getEntityName(); final InFlightMetadataCollector.EntityTableXref tableXref - = context.getMetadataCollector().getEntityTableXref( entityName ); + = getMetadataCollector().getEntityTableXref( entityName ); assert tableXref != null : "Could not locate EntityTableXref for entity [" + entityName + "]"; tableXref.addSecondaryTable( logicalName, join ); @@ -2278,7 +2298,7 @@ public class EntityBinder { ClassDetails classToProcess = annotatedClass.getSuperClass(); while ( classToProcess != null ) { - final AnnotatedClassType classType = context.getMetadataCollector().getClassType( classToProcess ); + final AnnotatedClassType classType = getMetadataCollector().getClassType( classToProcess ); if ( classType == MAPPED_SUPERCLASS ) { bindFilters( classToProcess ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ListBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ListBinder.java index b89476b6ee..3785495682 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ListBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ListBinder.java @@ -21,6 +21,7 @@ import org.hibernate.mapping.SimpleValue; import org.hibernate.resource.beans.spi.ManagedBean; import org.hibernate.usertype.UserCollectionType; +import static org.hibernate.boot.model.internal.PropertyHolderBuilder.buildPropertyHolder; import static org.hibernate.internal.util.StringHelper.qualify; /** @@ -65,14 +66,8 @@ public class ListBinder extends CollectionBinder { } private void bindIndex() { - final PropertyHolder valueHolder = PropertyHolderBuilder.buildPropertyHolder( - collection, - qualify( collection.getRole(), "key" ), - null, - null, - propertyHolder, - getBuildingContext() - ); + final PropertyHolder valueHolder = + buildPropertyHolder( collection, getPath(), null, null, propertyHolder, buildingContext ); if ( !collection.isOneToMany() ) { indexColumn.forceNotNull(); @@ -94,6 +89,10 @@ public class ListBinder extends CollectionBinder { createBackref(); } + private String getPath() { + return qualify( collection.getRole(), "key" ); + } + private void createBackref() { if ( collection.isOneToMany() && !collection.getKey().isNullable() diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java index 7be581dfd7..e78e260ae6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/MapBinder.java @@ -291,14 +291,8 @@ public class MapBinder extends CollectionBinder { private CollectionPropertyHolder buildCollectionPropertyHolder( MemberDetails property, ClassDetails keyClass) { - final CollectionPropertyHolder holder = buildPropertyHolder( - collection, - qualify( collection.getRole(), "mapkey" ), - keyClass, - property, - propertyHolder, - buildingContext - ); + final CollectionPropertyHolder holder = + buildPropertyHolder( collection, getPath(), keyClass, property, propertyHolder, buildingContext ); // 'propertyHolder' is the PropertyHolder for the owner of the collection // 'holder' is the CollectionPropertyHolder. // 'property' is the collection XProperty @@ -307,6 +301,10 @@ public class MapBinder extends CollectionBinder { return holder; } + private String getPath() { + return qualify( collection.getRole(), "mapkey" ); + } + private void handleForeignKey(MemberDetails property, ManyToOne element) { final ForeignKey foreignKey = getMapKeyForeignKey( property ); if ( foreignKey != null ) { @@ -472,8 +470,8 @@ public class MapBinder extends CollectionBinder { Collection collection, PersistentClass associatedClass, PersistentClass targetPropertyPersistentClass) { - if ( value instanceof Component ) { - return createIndexComponent( collection, associatedClass, (Component) value ); + if ( value instanceof Component component ) { + return createIndexComponent( collection, associatedClass, component ); } else { // HHH-11005 - only if we are @OneToMany and location of map key property is @@ -481,11 +479,11 @@ public class MapBinder extends CollectionBinder { final Table mapKeyTable = !associatedClass.equals( targetPropertyPersistentClass ) ? targetPropertyPersistentClass.getTable() : associatedClass.getTable(); - if ( value instanceof BasicValue ) { - return createDependantBasicValue( mapKeyTable, (BasicValue) value ); + if ( value instanceof BasicValue basicValue ) { + return createDependantBasicValue( mapKeyTable, basicValue ); } - else if ( value instanceof SimpleValue ) { - return createTargetValue( mapKeyTable, (SimpleValue) value ); + else if ( value instanceof SimpleValue simpleValue ) { + return createTargetValue( mapKeyTable, simpleValue ); } else { throw new AssertionFailure( "Unknown type encountered for map key: " + value.getClass() ); @@ -526,11 +524,11 @@ public class MapBinder extends CollectionBinder { } private static void addSelectable(SimpleValue targetValue, Selectable selectable) { - if ( selectable instanceof Column ) { - targetValue.addColumn( ( (Column) selectable).clone(), false, false ); + if ( selectable instanceof Column column ) { + targetValue.addColumn( column.clone(), false, false ); } - else if ( selectable instanceof Formula ) { - targetValue.addFormula( new Formula( ( (Formula) selectable).getFormula() ) ); + else if ( selectable instanceof Formula formula ) { + targetValue.addFormula( new Formula( formula.getFormula() ) ); } else { throw new AssertionFailure( "Unknown element in column iterator: " + selectable.getClass() ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NaturalIdBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NaturalIdBinder.java index 43993d6a58..97293aedb9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NaturalIdBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/NaturalIdBinder.java @@ -60,8 +60,8 @@ class NaturalIdBinder { final Property property = columns.resolveProperty(); if ( property.isComposite() ) { for ( Selectable selectable : property.getValue().getSelectables() ) { - if ( selectable instanceof org.hibernate.mapping.Column) { - uniqueKey.addColumn( tableColumn( (org.hibernate.mapping.Column) selectable, table, collector ) ); + if ( selectable instanceof org.hibernate.mapping.Column column) { + uniqueKey.addColumn( tableColumn( column, table, collector ) ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java index a493dad7f1..beb1feb426 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java @@ -442,14 +442,14 @@ public class PropertyBinder { } private void handleLob(Property property) { - if ( this.memberDetails != null ) { + if ( memberDetails != null ) { // HHH-4635 -- needed for dialect-specific property ordering - property.setLob( this.memberDetails.hasDirectAnnotationUsage( Lob.class ) ); + property.setLob( memberDetails.hasDirectAnnotationUsage( Lob.class ) ); } } private void handleMutability(Property property) { - if ( this.memberDetails != null && this.memberDetails.hasDirectAnnotationUsage( Immutable.class ) ) { + if ( memberDetails != null && memberDetails.hasDirectAnnotationUsage( Immutable.class ) ) { updatable = false; } property.setInsertable( insertable ); @@ -457,8 +457,8 @@ public class PropertyBinder { } private void handleOptional(Property property) { - if ( this.memberDetails != null ) { - property.setOptional( !isId && isOptional( this.memberDetails, this.holder ) ); + if ( memberDetails != null ) { + property.setOptional( !isId && isOptional( memberDetails, holder ) ); if ( property.isOptional() ) { final OptionalDeterminationSecondPass secondPass = persistentClasses -> { // Defer determining whether a property and its columns are nullable, @@ -487,8 +487,8 @@ public class PropertyBinder { } private void handleNaturalId(Property property) { - if ( this.memberDetails != null && entityBinder != null ) { - final NaturalId naturalId = this.memberDetails.getDirectAnnotationUsage( NaturalId.class ); + if ( memberDetails != null && entityBinder != null ) { + final NaturalId naturalId = memberDetails.getDirectAnnotationUsage( NaturalId.class ); if ( naturalId != null ) { if ( !entityBinder.isRootEntity() ) { throw new AnnotationException( "Property '" + qualify( holder.getPath(), name ) @@ -505,11 +505,11 @@ public class PropertyBinder { private void inferOptimisticLocking(Property property) { // this is already handled for collections in CollectionBinder... - if ( value instanceof Collection ) { - property.setOptimisticLocked( ((Collection) value).isOptimisticLocked() ); + if ( value instanceof Collection collection ) { + property.setOptimisticLocked( collection.isOptimisticLocked() ); } - else if ( this.memberDetails != null && this.memberDetails.hasDirectAnnotationUsage( OptimisticLock.class ) ) { - final OptimisticLock optimisticLock = this.memberDetails.getDirectAnnotationUsage( OptimisticLock.class ); + else if ( memberDetails != null && memberDetails.hasDirectAnnotationUsage( OptimisticLock.class ) ) { + final OptimisticLock optimisticLock = memberDetails.getDirectAnnotationUsage( OptimisticLock.class ); final boolean excluded = optimisticLock.excluded(); validateOptimisticLock( excluded ); property.setOptimisticLocked( !excluded ); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java b/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java index d125691d93..e1a40a2d0f 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Collection.java @@ -533,7 +533,7 @@ public abstract class Collection implements Fetchable, Value, Filterable, SoftDe @Override public boolean isSame(Value other) { return this == other - || other instanceof Collection && isSame( (Collection) other ); + || other instanceof Collection collection && isSame( collection ); } protected static boolean isSame(Value v1, Value v2) { @@ -770,8 +770,8 @@ public abstract class Collection implements Fetchable, Value, Filterable, SoftDe @SuppressWarnings("rawtypes") public void setTypeParameters(java.util.Map typeParameters) { - if ( typeParameters instanceof Properties ) { - this.typeParameters = (Properties) typeParameters; + if ( typeParameters instanceof Properties properties ) { + this.typeParameters = properties; } else { this.typeParameters = new Properties(); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/IndexedCollection.java b/hibernate-core/src/main/java/org/hibernate/mapping/IndexedCollection.java index a50c126685..ff8878f869 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/IndexedCollection.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/IndexedCollection.java @@ -40,9 +40,11 @@ public abstract class IndexedCollection extends Collection { public Value getIndex() { return index; } + public void setIndex(Value index) { this.index = index; } + public final boolean isIndexed() { return true; } @@ -53,18 +55,18 @@ public abstract class IndexedCollection extends Collection { @Override public boolean isSame(Collection other) { - return other instanceof IndexedCollection - && isSame( (IndexedCollection) other ); + return other instanceof IndexedCollection indexedCollection + && isSame( indexedCollection ); } public boolean isSame(IndexedCollection other) { return super.isSame( other ) - && isSame( index, other.index ); + && isSame( index, other.index ); } void createPrimaryKey() { if ( !isOneToMany() ) { - PrimaryKey pk = new PrimaryKey( getCollectionTable() ); + final PrimaryKey pk = new PrimaryKey( getCollectionTable() ); pk.addColumns( getKey() ); // index should be last column listed @@ -94,6 +96,7 @@ public abstract class IndexedCollection extends Collection { // } } + @Deprecated public void validate(Mapping mapping) throws MappingException { validate( (MappingContext) mapping); }