diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EntityMappingType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EntityMappingType.java index 5cf369059d4b..57f9b8762b89 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EntityMappingType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EntityMappingType.java @@ -493,8 +493,7 @@ default Object[] extractConcreteTypeStateValues( Map assemblerMapping, RowProcessingState rowProcessingState) { // todo (6.0) : getNumberOfAttributeMappings() needs to be fixed for this to work - bad walking of hierarchy - final Object[] values = new Object[ getNumberOfAttributeMappings() ]; - + final var values = new Object[ getNumberOfAttributeMappings() ]; forEachAttributeMapping( attribute -> { final DomainResultAssembler assembler = assemblerMapping.get( attribute ); @@ -509,7 +508,6 @@ default Object[] extractConcreteTypeStateValues( values[attribute.getStateArrayPosition()] = value; } ); - return values; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java index 006d8e2d04a4..79a61fe5037d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java @@ -132,7 +132,7 @@ public Object[] getValues(Object compositeInstance) { } protected Object[] getAttributeValues(Object compositeInstance) { - final Object[] results = new Object[getNumberOfAttributeMappings()]; + final var results = new Object[getNumberOfAttributeMappings()]; for ( int i = 0; i < results.length; i++ ) { results[i] = getValue( compositeInstance, i ); } @@ -659,7 +659,7 @@ public Object disassemble(Object value, SharedSessionContractImplementor session return null; } final int size = attributeMappings.size(); - final Object[] result = new Object[ size ]; + final var result = new Object[ size ]; for ( int i = 0; i < size; i++ ) { final var attributeMapping = attributeMappings.get( i ); final Object object = attributeMapping.getValue( value ); @@ -708,7 +708,7 @@ public int forEachDisassembledJdbcValue( } } else { - final Object[] values = (Object[]) value; + final var values = (Object[]) value; for ( int i = 0; i < attributeMappings.size(); i++ ) { final var mapping = attributeMappings.get( i ); span += mapping.forEachDisassembledJdbcValue( values[i], span + offset, x, y, valuesConsumer, session ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java index 21a2e8f67359..395328a6595e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java @@ -108,7 +108,7 @@ else if ( state.length == attributes.size() ) { return state; } else { - final Object[] values = new Object[attributes.size()]; + final var values = new Object[attributes.size()]; for ( int i = 0; i <= attributes.size() - 1; i++ ) { final var attributeMapping = attributes.get( i ); values[i] = state[attributeMapping.getStateArrayPosition()]; @@ -119,7 +119,7 @@ else if ( state.length == attributes.size() ) { @Override public Object[] extractNaturalIdFromEntity(Object entity) { - final Object[] values = new Object[ attributes.size() ]; + final var values = new Object[ attributes.size() ]; for ( int i = 0; i < attributes.size(); i++ ) { values[i] = attributes.get( i ).getPropertyAccess().getGetter().get( entity ); } @@ -133,7 +133,7 @@ public Object[] normalizeInput(Object incoming) { } else if ( incoming instanceof Map valueMap ) { final var attributes = getNaturalIdAttributes(); - final Object[] values = new Object[ attributes.size() ]; + final var values = new Object[ attributes.size() ]; for ( int i = 0; i < attributes.size(); i++ ) { values[ i ] = valueMap.get( attributes.get( i ).getAttributeName() ); } @@ -169,7 +169,7 @@ public int calculateHashCode(Object value) { return 0; } else { - final Object[] values = (Object[]) value; + final var values = (Object[]) value; int hashcode = 0; for ( int i = 0; i < attributes.size(); i++ ) { final Object o = values[i]; @@ -222,8 +222,8 @@ public void verifyFlushState(Object id, Object[] currentState, Object[] loadedSt @Override public boolean areEqual(Object one, Object other, SharedSessionContractImplementor session) { - final Object[] oneArray = (Object[]) one; - final Object[] otherArray = (Object[]) other; + final var oneArray = (Object[]) one; + final var otherArray = (Object[]) other; final var naturalIdAttributes = getNaturalIdAttributes(); for ( int i = 0; i < naturalIdAttributes.size(); i++ ) { if ( !naturalIdAttributes.get( i ).areEqual( oneArray[i], otherArray[i], session ) ) { @@ -387,7 +387,7 @@ public Object disassemble(Object value, SharedSessionContractImplementor session } else if ( value instanceof Object[] incoming ) { assert incoming.length == attributes.size(); - final Object[] outgoing = new Object[incoming.length]; + final var outgoing = new Object[incoming.length]; for ( int i = 0; i < attributes.size(); i++ ) { outgoing[i] = attributes.get( i ).disassemble( incoming[i], session ); } @@ -630,7 +630,7 @@ private AssemblerImpl(ImmutableFetchList fetches, JavaType jtd, Assemb @Override public Object[] assemble(RowProcessingState rowProcessingState) { - final Object[] result = new Object[ subAssemblers.length ]; + final var result = new Object[ subAssemblers.length ]; for ( int i = 0; i < subAssemblers.length; i++ ) { result[ i ] = subAssemblers[i].assemble( rowProcessingState ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java index d41eb996823a..48809f49bd69 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java @@ -318,7 +318,7 @@ public int forEachDisassembledJdbcValue( } else { if ( value.getClass().isArray() ) { - final Object[] values = (Object[]) value; + final var values = (Object[]) value; valuesConsumer.consume( offset, x, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java index 26e929551532..b957478d6c88 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java @@ -871,7 +871,7 @@ protected Object[] getAttributeValues(Object compositeInstance) { } else { final int numberOfAttributes = getNumberOfAttributeMappings(); - final Object[] results = new Object[numberOfAttributes + 1]; + final var results = new Object[numberOfAttributes + 1]; final var concreteEmbeddableType = findSubtypeBySubclass( compositeInstance.getClass().getName() ); int i = 0; for ( ; i < numberOfAttributes; i++ ) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java index 7255aa3c04c8..266b7e0d32a2 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java @@ -161,7 +161,7 @@ public EmbeddableValuedModelPart getEmbeddedPart() { public Object getIdentifier(Object entity, SharedSessionContractImplementor session) { final Object id = representationStrategy.getInstantiator().instantiate( null ); - final Object[] propertyValues = new Object[virtualIdEmbeddable.getNumberOfAttributeMappings()]; + final var propertyValues = new Object[virtualIdEmbeddable.getNumberOfAttributeMappings()]; for ( int i = 0; i < propertyValues.length; i++ ) { final var attributeMapping = virtualIdEmbeddable.getAttributeMapping( i ); @@ -203,7 +203,7 @@ public void setIdentifier(Object entity, Object id, SharedSessionContractImpleme final var entityDescriptor = factory.getMappingMetamodel() .getEntityDescriptor( entity.getClass() ); - final Object[] propertyValues = new Object[attributeMappings.size()]; + final var propertyValues = new Object[attributeMappings.size()]; virtualIdEmbeddable.forEachAttribute( (position, virtualIdAttribute) -> { final var idClassAttribute = attributeMappings.get( position ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/InverseNonAggregatedIdentifierMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/InverseNonAggregatedIdentifierMapping.java index bacbb5384744..6c7fcbe46677 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/InverseNonAggregatedIdentifierMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/InverseNonAggregatedIdentifierMapping.java @@ -196,7 +196,7 @@ public Object getIdentifier(Object entity, MergeContext mergeContext) { if ( hasContainingClass() ) { final Object id = identifierValueMapper.getRepresentationStrategy().getInstantiator().instantiate( null ); final var embeddableTypeDescriptor = getEmbeddableTypeDescriptor(); - final Object[] propertyValues = new Object[embeddableTypeDescriptor.getNumberOfAttributeMappings()]; + final var propertyValues = new Object[embeddableTypeDescriptor.getNumberOfAttributeMappings()]; for ( int i = 0; i < propertyValues.length; i++ ) { final var attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i ); final Object object = attributeMapping.getValue( entity ); @@ -247,7 +247,7 @@ private static Object getIfMerged(Object o, MergeContext mergeContext) { @Override public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) { - final Object[] propertyValues = new Object[identifierValueMapper.getNumberOfAttributeMappings()]; + final var propertyValues = new Object[identifierValueMapper.getNumberOfAttributeMappings()]; final var embeddableTypeDescriptor = getEmbeddableTypeDescriptor(); for ( int position = 0; position < propertyValues.length; position++ ) { final var attribute = embeddableTypeDescriptor.getAttributeMapping( position ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/NonAggregatedIdentifierMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/NonAggregatedIdentifierMappingImpl.java index 5909d5f91611..b81f892f4ff0 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/NonAggregatedIdentifierMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/NonAggregatedIdentifierMappingImpl.java @@ -235,7 +235,7 @@ public Object getIdentifier(Object entity, MergeContext mergeContext) { return lazyInitializer.getInternalIdentifier(); } final var embeddableTypeDescriptor = getEmbeddableTypeDescriptor(); - final Object[] propertyValues = new Object[embeddableTypeDescriptor.getNumberOfAttributeMappings()]; + final var propertyValues = new Object[embeddableTypeDescriptor.getNumberOfAttributeMappings()]; for ( int i = 0; i < propertyValues.length; i++ ) { final var attributeMapping = embeddableTypeDescriptor.getAttributeMapping( i ); final Object o = attributeMapping.getValue( entity ); @@ -281,7 +281,7 @@ private static Object getIfMerged(Object o, MergeContext mergeContext) { @Override public void setIdentifier(Object entity, Object id, SharedSessionContractImplementor session) { - final Object[] propertyValues = new Object[identifierValueMapper.getNumberOfAttributeMappings()]; + final var propertyValues = new Object[identifierValueMapper.getNumberOfAttributeMappings()]; final var embeddableTypeDescriptor = getEmbeddableTypeDescriptor(); for ( int i = 0; i < propertyValues.length; i++ ) { final var attribute = embeddableTypeDescriptor.getAttributeMapping( i ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java index e68641444fd6..555117bf9d97 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java @@ -112,7 +112,7 @@ public void validateInternalForm(Object naturalIdValue) { final var naturalIdValueClass = naturalIdValue.getClass(); if ( naturalIdValueClass.isArray() && !naturalIdValueClass.getComponentType().isPrimitive() ) { // be flexible - final Object[] values = (Object[]) naturalIdValue; + final var values = (Object[]) naturalIdValue; if ( values.length == 1 ) { naturalIdValue = values[0]; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdRepresentationStrategy.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdRepresentationStrategy.java index 77367bf174f9..cff3903e3bfe 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdRepresentationStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdRepresentationStrategy.java @@ -88,7 +88,7 @@ public InstantiatorAdapter(VirtualIdEmbeddable virtualIdEmbeddable, EntityMappin public Object instantiate(ValueAccess valuesAccess) { final Object instantiated = entityInstantiator.instantiate(); if ( valuesAccess != null ) { - final Object[] values = valuesAccess.getValues(); + final var values = valuesAccess.getValues(); if ( values != null ) { virtualIdEmbeddable.setValues( instantiated, values ); } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java index 61ee06c6f828..d29f16385c89 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java @@ -58,7 +58,6 @@ import org.hibernate.sql.model.ast.TableUpdate; import org.hibernate.sql.model.ast.builder.CollectionRowDeleteByUpdateSetNullBuilder; import org.hibernate.sql.model.ast.builder.TableUpdateBuilderStandard; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.sql.model.internal.TableUpdateStandard; import org.hibernate.sql.model.jdbc.JdbcMutationOperation; @@ -68,6 +67,7 @@ import static org.hibernate.persister.collection.mutation.RowMutationOperations.DEFAULT_RESTRICTOR; import static org.hibernate.persister.collection.mutation.RowMutationOperations.DEFAULT_VALUE_SETTER; import static org.hibernate.sql.model.ast.builder.TableUpdateBuilder.NULL; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * A {@link CollectionPersister} for {@linkplain jakarta.persistence.OneToMany @@ -198,7 +198,7 @@ private void writeIndex( final var mutationExecutor = mutationExecutorService.createExecutor( () -> new BasicBatchKey( getNavigableRole() + "#INDEX" ), - MutationOperationGroupFactory.singleOperation( MutationType.UPDATE, this, updateRowOperation ), + singleOperation( MutationType.UPDATE, this, updateRowOperation ), session ); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/AbstractUpdateRowsCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/AbstractUpdateRowsCoordinator.java index 620a6ab9cfc8..5b5658252627 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/AbstractUpdateRowsCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/AbstractUpdateRowsCoordinator.java @@ -22,7 +22,9 @@ public abstract class AbstractUpdateRowsCoordinator implements UpdateRowsCoordin public AbstractUpdateRowsCoordinator(CollectionMutationTarget mutationTarget, SessionFactoryImplementor sessionFactory) { this.mutationTarget = mutationTarget; this.sessionFactory = sessionFactory; - this.mutationExecutorService = sessionFactory.getServiceRegistry().getService( MutationExecutorService.class ); + mutationExecutorService = + sessionFactory.getServiceRegistry() + .getService( MutationExecutorService.class ); } @Override @@ -44,7 +46,7 @@ public void updateRows(Object key, PersistentCollection collection, SharedSes MODEL_MUTATION_LOGGER.updatingCollectionRows( mutationTarget.getRolePath(), key ); // update all the modified entries - int count = doUpdate( key, collection, session ); + final int count = doUpdate( key, collection, session ); MODEL_MUTATION_LOGGER.updatedCollectionRows( count, mutationTarget.getRolePath(), key ); } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorStandard.java index d84968ee5f19..f6698fb4d754 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorStandard.java @@ -4,23 +4,16 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Iterator; - import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; -import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; -import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.service.ServiceRegistry; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * @author Steve Ebersole @@ -44,8 +37,8 @@ public DeleteRowsCoordinatorStandard( this.rowMutationOperations = rowMutationOperations; this.deleteByIndex = deleteByIndex; - this.batchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#DELETE" ); - this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); + batchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#DELETE" ); + mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); } @Override @@ -63,18 +56,18 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes MODEL_MUTATION_LOGGER.deletingRemovedCollectionRows( mutationTarget.getRolePath(), key ); } - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( + final var mutationExecutor = mutationExecutorService.createExecutor( () -> batchKey, operationGroup, session ); - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); try { - final PluralAttributeMapping pluralAttribute = mutationTarget.getTargetPart(); - final CollectionPersister collectionDescriptor = pluralAttribute.getCollectionDescriptor(); + final var pluralAttribute = mutationTarget.getTargetPart(); + final var collectionDescriptor = pluralAttribute.getCollectionDescriptor(); - final Iterator deletes = collection.getDeletes( collectionDescriptor, !deleteByIndex ); + final var deletes = collection.getDeletes( collectionDescriptor, !deleteByIndex ); if ( !deletes.hasNext() ) { MODEL_MUTATION_LOGGER.noRowsToDelete(); return; @@ -82,7 +75,7 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes int deletionCount = 0; - final RowMutationOperations.Restrictions restrictions = rowMutationOperations.getDeleteRowRestrictions(); + final var restrictions = rowMutationOperations.getDeleteRowRestrictions(); while ( deletes.hasNext() ) { final Object removal = deletes.next(); @@ -109,10 +102,10 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes } private MutationOperationGroup createOperationGroup() { - assert mutationTarget.getTargetPart() != null; - assert mutationTarget.getTargetPart().getKeyDescriptor() != null; + assert mutationTarget.getTargetPart() != null + && mutationTarget.getTargetPart().getKeyDescriptor() != null; - final JdbcMutationOperation operation = rowMutationOperations.getDeleteRowOperation(); - return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation ); + final var operation = rowMutationOperations.getDeleteRowOperation(); + return singleOperation( MutationType.DELETE, mutationTarget, operation ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorTablePerSubclass.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorTablePerSubclass.java index fcf11d133063..f6f47da52ce0 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorTablePerSubclass.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorTablePerSubclass.java @@ -4,26 +4,20 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Iterator; - import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess; import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; -import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.collection.OneToManyPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.service.ServiceRegistry; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * OneToMany delete coordinator if the element is a {@link org.hibernate.persister.entity.UnionSubclassEntityPersister}. @@ -44,8 +38,10 @@ public DeleteRowsCoordinatorTablePerSubclass( this.mutationTarget = mutationTarget; this.rowMutationOperations = rowMutationOperations; this.deleteByIndex = deleteByIndex; - this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister().getRootEntityDescriptor().getSubclassEntityNames().size()]; - this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); + subclassEntries = + new SubclassEntry[mutationTarget.getElementPersister() + .getRootEntityDescriptor().getSubclassEntityNames().size()]; + mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); } @Override @@ -59,15 +55,15 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes MODEL_MUTATION_LOGGER.deletingRemovedCollectionRows( mutationTarget.getRolePath(), key ); } - final PluralAttributeMapping pluralAttribute = mutationTarget.getTargetPart(); - final CollectionPersister collectionDescriptor = pluralAttribute.getCollectionDescriptor(); + final var pluralAttribute = mutationTarget.getTargetPart(); + final var collectionDescriptor = pluralAttribute.getCollectionDescriptor(); - final Iterator deletes = collection.getDeletes( collectionDescriptor, !deleteByIndex ); + final var deletes = collection.getDeletes( collectionDescriptor, !deleteByIndex ); if ( !deletes.hasNext() ) { MODEL_MUTATION_LOGGER.noRowsToDelete(); return; } - final MutationExecutor[] executors = new MutationExecutor[subclassEntries.length]; + final var executors = new MutationExecutor[subclassEntries.length]; try { int deletionCount = 0; @@ -75,11 +71,11 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes while ( deletes.hasNext() ) { final Object removal = deletes.next(); - final EntityEntry entityEntry = session.getPersistenceContextInternal().getEntry( removal ); + final var entityEntry = session.getPersistenceContextInternal().getEntry( removal ); final int subclassId = entityEntry.getPersister().getSubclassId(); final MutationExecutor mutationExecutor; if ( executors[subclassId] == null ) { - final SubclassEntry subclassEntry = getSubclassEntry( entityEntry.getPersister() ); + final var subclassEntry = getSubclassEntry( entityEntry.getPersister() ); mutationExecutor = executors[subclassId] = mutationExecutorService.createExecutor( subclassEntry.batchKeySupplier, subclassEntry.operationGroup, @@ -117,11 +113,11 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes private SubclassEntry getSubclassEntry(EntityPersister elementPersister) { final int subclassId = elementPersister.getSubclassId(); - final SubclassEntry subclassEntry = subclassEntries[subclassId]; + final var subclassEntry = subclassEntries[subclassId]; if ( subclassEntry != null ) { return subclassEntry; } - final BasicBatchKey basicBatchKey = + final var basicBatchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#DELETE#" + subclassId ); return subclassEntries[subclassId] = new SubclassEntry( () -> basicBatchKey, @@ -130,11 +126,11 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) { } private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) { - assert mutationTarget.getTargetPart() != null; - assert mutationTarget.getTargetPart().getKeyDescriptor() != null; + assert mutationTarget.getTargetPart() != null + && mutationTarget.getTargetPart().getKeyDescriptor() != null; - final CollectionTableMapping collectionTableMapping = mutationTarget.getCollectionTableMapping(); - final JdbcMutationOperation operation = rowMutationOperations.getDeleteRowOperation( + final var collectionTableMapping = mutationTarget.getCollectionTableMapping(); + final var operation = rowMutationOperations.getDeleteRowOperation( new CollectionTableMapping( elementPersister.getMappedTableDetails().getTableName(), collectionTableMapping.getSpaces(), @@ -147,7 +143,7 @@ private MutationOperationGroup createOperationGroup(EntityPersister elementPersi collectionTableMapping.getDeleteRowDetails() ) ); - return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation ); + return singleOperation( MutationType.DELETE, mutationTarget, operation ); } private static class SubclassEntry { diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorStandard.java index 5e031a576bd2..d99ba243829d 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorStandard.java @@ -4,23 +4,17 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Iterator; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; -import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; -import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.service.ServiceRegistry; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * @author Steve Ebersole @@ -41,8 +35,8 @@ public InsertRowsCoordinatorStandard( this.mutationTarget = mutationTarget; this.rowMutationOperations = rowMutationOperations; - this.batchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#INSERT" ); - this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); + batchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#INSERT" ); + mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); } @Override @@ -69,18 +63,18 @@ public void insertRows( MODEL_MUTATION_LOGGER.insertingNewCollectionRows( mutationTarget.getRolePath(), id ); } - final PluralAttributeMapping pluralAttribute = mutationTarget.getTargetPart(); - final CollectionPersister collectionDescriptor = pluralAttribute.getCollectionDescriptor(); + final var pluralAttribute = mutationTarget.getTargetPart(); + final var collectionDescriptor = pluralAttribute.getCollectionDescriptor(); - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( + final var mutationExecutor = mutationExecutorService.createExecutor( () -> batchKey, operationGroup, session ); - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); try { - final Iterator entries = collection.entries( collectionDescriptor ); + final var entries = collection.entries( collectionDescriptor ); collection.preInsert( collectionDescriptor ); if ( !entries.hasNext() ) { MODEL_MUTATION_LOGGER.noCollectionRowsToInsert( mutationTarget.getRolePath(), id ); @@ -89,7 +83,7 @@ public void insertRows( int entryCount = 0; - final RowMutationOperations.Values insertRowValues = rowMutationOperations.getInsertRowValues(); + final var insertRowValues = rowMutationOperations.getInsertRowValues(); while ( entries.hasNext() ) { final Object entry = entries.next(); @@ -119,10 +113,10 @@ public void insertRows( } private MutationOperationGroup createOperationGroup() { - assert mutationTarget.getTargetPart() != null; - assert mutationTarget.getTargetPart().getKeyDescriptor() != null; + assert mutationTarget.getTargetPart() != null + && mutationTarget.getTargetPart().getKeyDescriptor() != null; - final JdbcMutationOperation operation = rowMutationOperations.getInsertRowOperation(); - return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation ); + final var operation = rowMutationOperations.getInsertRowOperation(); + return singleOperation( MutationType.INSERT, mutationTarget, operation ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorTablePerSubclass.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorTablePerSubclass.java index fb1f4028b216..57c536028541 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorTablePerSubclass.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorTablePerSubclass.java @@ -4,26 +4,21 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Iterator; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess; import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; -import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.collection.OneToManyPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.service.ServiceRegistry; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * OneToMany insert coordinator if the element is a {@link org.hibernate.persister.entity.UnionSubclassEntityPersister}. @@ -41,12 +36,12 @@ public InsertRowsCoordinatorTablePerSubclass( ServiceRegistry serviceRegistry) { this.mutationTarget = mutationTarget; this.rowMutationOperations = rowMutationOperations; - this.subclassEntries = + subclassEntries = new SubclassEntry[mutationTarget.getElementPersister() .getRootEntityDescriptor() .getSubclassEntityNames() .size()]; - this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); + mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); } @Override @@ -69,27 +64,27 @@ public void insertRows( MODEL_MUTATION_LOGGER.insertingNewCollectionRows( mutationTarget.getRolePath(), id ); } - final PluralAttributeMapping pluralAttribute = mutationTarget.getTargetPart(); - final CollectionPersister collectionDescriptor = pluralAttribute.getCollectionDescriptor(); + final var pluralAttribute = mutationTarget.getTargetPart(); + final var collectionDescriptor = pluralAttribute.getCollectionDescriptor(); - final Iterator entries = collection.entries( collectionDescriptor ); + final var entries = collection.entries( collectionDescriptor ); collection.preInsert( collectionDescriptor ); if ( !entries.hasNext() ) { MODEL_MUTATION_LOGGER.noCollectionRowsToInsert( mutationTarget.getRolePath(), id ); return; } - final MutationExecutor[] executors = new MutationExecutor[subclassEntries.length]; + final var executors = new MutationExecutor[subclassEntries.length]; try { int entryCount = 0; while ( entries.hasNext() ) { final Object entry = entries.next(); if ( entryChecker == null || entryChecker.include( entry, entryCount, collection, pluralAttribute ) ) { - final EntityEntry entityEntry = session.getPersistenceContextInternal().getEntry( entry ); + final var entityEntry = session.getPersistenceContextInternal().getEntry( entry ); final int subclassId = entityEntry.getPersister().getSubclassId(); final MutationExecutor mutationExecutor; if ( executors[subclassId] == null ) { - final SubclassEntry subclassEntry = getSubclassEntry( entityEntry.getPersister() ); + final var subclassEntry = getSubclassEntry( entityEntry.getPersister() ); mutationExecutor = executors[subclassId] = mutationExecutorService.createExecutor( subclassEntry.batchKeySupplier, subclassEntry.operationGroup, @@ -118,7 +113,7 @@ public void insertRows( } finally { - for ( MutationExecutor executor : executors ) { + for ( var executor : executors ) { if ( executor != null ) { executor.release(); } @@ -128,11 +123,11 @@ public void insertRows( private SubclassEntry getSubclassEntry(EntityPersister elementPersister) { final int subclassId = elementPersister.getSubclassId(); - final SubclassEntry subclassEntry = subclassEntries[subclassId]; + final var subclassEntry = subclassEntries[subclassId]; if ( subclassEntry != null ) { return subclassEntry; } - final BasicBatchKey basicBatchKey = + final var basicBatchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#INSERT#" + subclassId ); return subclassEntries[subclassId] = new SubclassEntry( () -> basicBatchKey, @@ -141,11 +136,11 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) { } private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) { - assert mutationTarget.getTargetPart() != null; - assert mutationTarget.getTargetPart().getKeyDescriptor() != null; + assert mutationTarget.getTargetPart() != null + && mutationTarget.getTargetPart().getKeyDescriptor() != null; - final CollectionTableMapping collectionTableMapping = mutationTarget.getCollectionTableMapping(); - final JdbcMutationOperation operation = rowMutationOperations.getInsertRowOperation( + final var collectionTableMapping = mutationTarget.getCollectionTableMapping(); + final var operation = rowMutationOperations.getInsertRowOperation( new CollectionTableMapping( elementPersister.getMappedTableDetails().getTableName(), collectionTableMapping.getSpaces(), @@ -158,7 +153,7 @@ private MutationOperationGroup createOperationGroup(EntityPersister elementPersi collectionTableMapping.getDeleteRowDetails() ) ); - return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation ); + return singleOperation( MutationType.INSERT, mutationTarget, operation ); } private static class SubclassEntry { diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorStandard.java index f288b1ea5ac5..ca83d28999ed 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorStandard.java @@ -5,12 +5,8 @@ package org.hibernate.persister.collection.mutation; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; -import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; -import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.service.ServiceRegistry; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; @@ -18,6 +14,7 @@ import org.hibernate.sql.model.jdbc.JdbcMutationOperation; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * Handles complete removal of a collection by its key @@ -45,8 +42,8 @@ public RemoveCoordinatorStandard( this.mutationTarget = mutationTarget; this.operationProducer = operationProducer; - this.batchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#REMOVE" ); - this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); + batchKey = new BasicBatchKey( mutationTarget.getRolePath() + "#REMOVE" ); + mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); } @Override @@ -66,7 +63,7 @@ public String getSqlString() { operationGroup = buildOperationGroup(); } - final JdbcMutationOperation operation = (JdbcMutationOperation) operationGroup.getSingleOperation(); + final var operation = (JdbcMutationOperation) operationGroup.getSingleOperation(); return operation.getSqlString(); } @@ -81,16 +78,16 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session) operationGroup = buildOperationGroup(); } - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( + final var mutationExecutor = mutationExecutorService.createExecutor( () -> batchKey, operationGroup, session ); try { - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); - final ForeignKeyDescriptor fkDescriptor = mutationTarget.getTargetPart().getKeyDescriptor(); - fkDescriptor.getKeyPart().decompose( + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + final var foreignKeyDescriptor = mutationTarget.getTargetPart().getKeyDescriptor(); + foreignKeyDescriptor.getKeyPart().decompose( key, 0, jdbcValueBindings, @@ -113,21 +110,17 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session) } private MutationOperationGroup buildOperationGroup() { - assert mutationTarget.getTargetPart() != null; - assert mutationTarget.getTargetPart().getKeyDescriptor() != null; + assert mutationTarget.getTargetPart() != null + && mutationTarget.getTargetPart().getKeyDescriptor() != null; // if ( MODEL_MUTATION_LOGGER.isTraceEnabled() ) { // MODEL_MUTATION_LOGGER.tracef( "Starting RemoveCoordinator#buildOperationGroup - %s", // mutationTarget.getRolePath() ); // } - final CollectionTableMapping tableMapping = mutationTarget.getCollectionTableMapping(); - final MutatingTableReference tableReference = new MutatingTableReference( tableMapping ); - - return MutationOperationGroupFactory.singleOperation( - MutationType.DELETE, - mutationTarget, - operationProducer.createOperation( tableReference ) - ); + final var tableMapping = mutationTarget.getCollectionTableMapping(); + final var tableReference = new MutatingTableReference( tableMapping ); + return singleOperation( MutationType.DELETE, mutationTarget, + operationProducer.createOperation( tableReference ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorTablePerSubclass.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorTablePerSubclass.java index af89c3e7f06b..01b63ad1c67c 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorTablePerSubclass.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorTablePerSubclass.java @@ -4,14 +4,9 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Collection; -import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.EntityMappingType; -import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.persister.collection.OneToManyPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.service.ServiceRegistry; @@ -20,6 +15,7 @@ import org.hibernate.sql.model.ast.MutatingTableReference; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * OneToMany remove coordinator if the element is a {@link org.hibernate.persister.entity.UnionSubclassEntityPersister}. @@ -43,7 +39,7 @@ public RemoveCoordinatorTablePerSubclass( ServiceRegistry serviceRegistry) { this.mutationTarget = mutationTarget; this.operationProducer = operationProducer; - this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); + mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class ); } @Override @@ -67,23 +63,23 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session) MODEL_MUTATION_LOGGER.removingCollection( mutationTarget.getRolePath(), key ); } - MutationOperationGroup[] operationGroups = this.operationGroups; + var operationGroups = this.operationGroups; if ( operationGroups == null ) { // delayed creation of the operation-group operationGroups = this.operationGroups = buildOperationGroups(); } - final ForeignKeyDescriptor fkDescriptor = mutationTarget.getTargetPart().getKeyDescriptor(); + final var foreignKeyDescriptor = mutationTarget.getTargetPart().getKeyDescriptor(); - for ( MutationOperationGroup operationGroup : operationGroups ) { - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( + for ( var operationGroup : operationGroups ) { + final var mutationExecutor = mutationExecutorService.createExecutor( () -> null, operationGroup, session ); try { - fkDescriptor.getKeyPart().decompose( + foreignKeyDescriptor.getKeyPart().decompose( key, 0, mutationExecutor.getJdbcValueBindings(), @@ -107,28 +103,29 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session) } private MutationOperationGroup[] buildOperationGroups() { - final Collection subMappingTypes = mutationTarget.getElementPersister() - .getRootEntityDescriptor() - .getSubMappingTypes(); - final MutationOperationGroup[] operationGroups = new MutationOperationGroup[subMappingTypes.size()]; + final var subMappingTypes = + mutationTarget.getElementPersister() + .getRootEntityDescriptor() + .getSubMappingTypes(); + final var operationGroups = new MutationOperationGroup[subMappingTypes.size()]; int i = 0; - for ( EntityMappingType subMappingType : subMappingTypes ) { + for ( var subMappingType : subMappingTypes ) { operationGroups[i++] = buildOperationGroup( subMappingType.getEntityPersister() ); } return operationGroups; } private MutationOperationGroup buildOperationGroup(EntityPersister elementPersister) { - assert mutationTarget.getTargetPart() != null; - assert mutationTarget.getTargetPart().getKeyDescriptor() != null; + assert mutationTarget.getTargetPart() != null + && mutationTarget.getTargetPart().getKeyDescriptor() != null; // if ( MODEL_MUTATION_LOGGER.isTraceEnabled() ) { // MODEL_MUTATION_LOGGER.tracef( "Starting RemoveCoordinator#buildOperationGroup - %s", // mutationTarget.getRolePath() ); // } - final CollectionTableMapping collectionTableMapping = mutationTarget.getCollectionTableMapping(); - final MutatingTableReference tableReference = new MutatingTableReference( + final var collectionTableMapping = mutationTarget.getCollectionTableMapping(); + final var tableReference = new MutatingTableReference( new CollectionTableMapping( elementPersister.getMappedTableDetails().getTableName(), collectionTableMapping.getSpaces(), @@ -142,10 +139,7 @@ private MutationOperationGroup buildOperationGroup(EntityPersister elementPersis ) ); - return MutationOperationGroupFactory.singleOperation( - MutationType.DELETE, - mutationTarget, - operationProducer.createOperation( tableReference ) - ); + return singleOperation( MutationType.DELETE, mutationTarget, + operationProducer.createOperation( tableReference ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RowMutationOperations.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RowMutationOperations.java index a2f16a6daaf3..b932b32cb317 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RowMutationOperations.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RowMutationOperations.java @@ -8,13 +8,14 @@ import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; import org.hibernate.engine.jdbc.mutation.ParameterUsage; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.util.NullnessHelper; import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.TableMapping; import org.hibernate.sql.model.ast.MutatingTableReference; import org.hibernate.sql.model.jdbc.JdbcMutationOperation; +import static org.hibernate.internal.util.NullnessHelper.areSameNullness; + /** * Composition of the {@link MutationOperation} references for a collection mapping. * @@ -57,9 +58,9 @@ public RowMutationOperations( Restrictions deleteRowRestrictions) { this.target = target; - assert NullnessHelper.areSameNullness( insertRowOperationProducer, insertRowValues ); - assert NullnessHelper.areSameNullness( updateRowOperationProducer, updateRowValues, updateRowRestrictions ); - assert NullnessHelper.areSameNullness( deleteRowOperationProducer, deleteRowRestrictions ); + assert areSameNullness( insertRowOperationProducer, insertRowValues ); + assert areSameNullness( updateRowOperationProducer, updateRowValues, updateRowRestrictions ); + assert areSameNullness( deleteRowOperationProducer, deleteRowRestrictions ); this.insertRowOperationProducer = insertRowOperationProducer; this.insertRowValues = insertRowValues; @@ -93,23 +94,24 @@ public JdbcMutationOperation getInsertRowOperation() { if ( !hasInsertRow() ) { return null; } - - JdbcMutationOperation local = insertRowOperation; - if ( local == null ) { - final MutatingTableReference tableReference = new MutatingTableReference( target.getCollectionTableMapping() ); - insertRowOperation = local = insertRowOperationProducer.createOperation( tableReference ); + else { + JdbcMutationOperation local = insertRowOperation; + if ( local == null ) { + final var tableReference = new MutatingTableReference( target.getCollectionTableMapping() ); + insertRowOperation = local = insertRowOperationProducer.createOperation( tableReference ); + } + return local; } - - return local; } public JdbcMutationOperation getInsertRowOperation(TableMapping tableMapping) { if ( !hasInsertRow() ) { return null; } - - final MutatingTableReference tableReference = new MutatingTableReference( tableMapping ); - return insertRowOperationProducer.createOperation( tableReference ); + else { + final var tableReference = new MutatingTableReference( tableMapping ); + return insertRowOperationProducer.createOperation( tableReference ); + } } @@ -124,14 +126,14 @@ public JdbcMutationOperation getUpdateRowOperation() { if ( !hasUpdateRow() ) { return null; } - - JdbcMutationOperation local = updateRowOperation; - if ( local == null ) { - final MutatingTableReference tableReference = new MutatingTableReference( target.getCollectionTableMapping() ); - updateRowOperation = local = updateRowOperationProducer.createOperation( tableReference ); + else { + JdbcMutationOperation local = updateRowOperation; + if ( local == null ) { + final var tableReference = new MutatingTableReference( target.getCollectionTableMapping() ); + updateRowOperation = local = updateRowOperationProducer.createOperation( tableReference ); + } + return local; } - - return local; } public Values getUpdateRowValues() { @@ -158,23 +160,24 @@ public JdbcMutationOperation getDeleteRowOperation() { if ( !hasDeleteRow() ) { return null; } - - JdbcMutationOperation local = deleteRowOperation; - if ( local == null ) { - final MutatingTableReference tableReference = new MutatingTableReference( target.getCollectionTableMapping() ); - deleteRowOperation = local = deleteRowOperationProducer.createOperation( tableReference ); + else { + JdbcMutationOperation local = deleteRowOperation; + if ( local == null ) { + final var tableReference = new MutatingTableReference( target.getCollectionTableMapping() ); + deleteRowOperation = local = deleteRowOperationProducer.createOperation( tableReference ); + } + return local; } - - return local; } public JdbcMutationOperation getDeleteRowOperation(TableMapping tableMapping) { if ( !hasInsertRow() ) { return null; } - - final MutatingTableReference tableReference = new MutatingTableReference( tableMapping ); - return deleteRowOperationProducer.createOperation( tableReference ); + else { + final var tableReference = new MutatingTableReference( tableMapping ); + return deleteRowOperationProducer.createOperation( tableReference ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorOneToMany.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorOneToMany.java index 0a17d37afe95..b6df96bae76f 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorOneToMany.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorOneToMany.java @@ -4,20 +4,15 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Iterator; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; -import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; -import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; + +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * @author Steve Ebersole @@ -50,102 +45,86 @@ protected int doUpdate(Object key, PersistentCollection collection, SharedSes } private void deleteRows(Object key, PersistentCollection collection, SharedSessionContractImplementor session) { - final PluralAttributeMapping attributeMapping = getMutationTarget().getTargetPart(); - final CollectionPersister collectionDescriptor = attributeMapping.getCollectionDescriptor(); - final Iterator entries = collection.entries( collectionDescriptor ); - if ( !entries.hasNext() ) { - return; - } - - final MutationOperationGroup operationGroup = resolveDeleteGroup(); - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( - () -> new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-DELETE" ), - operationGroup, - session - ); - - try { - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); - - int entryPosition = -1; - - while ( entries.hasNext() ) { - final Object entry = entries.next(); - entryPosition++; - - if ( !collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { - continue; + final var attributeMapping = getMutationTarget().getTargetPart(); + final var collectionDescriptor = attributeMapping.getCollectionDescriptor(); + final var entries = collection.entries( collectionDescriptor ); + if ( entries.hasNext() ) { + final var operationGroup = resolveDeleteGroup(); + final var mutationExecutor = mutationExecutorService.createExecutor( + () -> new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-DELETE" ), + operationGroup, + session + ); + + try { + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + int entryPosition = -1; + while ( entries.hasNext() ) { + final Object entry = entries.next(); + entryPosition++; + if ( collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { + final Object entryToUpdate = collection.getSnapshotElement( entry, entryPosition ); + rowMutationOperations.getDeleteRowRestrictions().applyRestrictions( + collection, + key, + entryToUpdate, + entryPosition, + session, + jdbcValueBindings + ); + mutationExecutor.execute( entryToUpdate, null, null, null, session ); + } } - final Object entryToUpdate = collection.getSnapshotElement( entry, entryPosition ); - - rowMutationOperations.getDeleteRowRestrictions().applyRestrictions( - collection, - key, - entryToUpdate, - entryPosition, - session, - jdbcValueBindings - ); - - mutationExecutor.execute( entryToUpdate, null, null, null, session ); } - } - finally { - mutationExecutor.release(); + finally { + mutationExecutor.release(); + } } } private MutationOperationGroup resolveDeleteGroup() { if ( deleteOperationGroup == null ) { - final JdbcMutationOperation operation = rowMutationOperations.getDeleteRowOperation(); + final var operation = rowMutationOperations.getDeleteRowOperation(); assert operation != null; - - deleteOperationGroup = MutationOperationGroupFactory.singleOperation( MutationType.DELETE, getMutationTarget(), operation ); + deleteOperationGroup = singleOperation( MutationType.DELETE, getMutationTarget(), operation ); } - return deleteOperationGroup; } private int insertRows(Object key, PersistentCollection collection, SharedSessionContractImplementor session) { - final PluralAttributeMapping attributeMapping = getMutationTarget().getTargetPart(); - final CollectionPersister collectionDescriptor = attributeMapping.getCollectionDescriptor(); - final Iterator entries = collection.entries( collectionDescriptor ); + final var attributeMapping = getMutationTarget().getTargetPart(); + final var collectionDescriptor = attributeMapping.getCollectionDescriptor(); + final var entries = collection.entries( collectionDescriptor ); if ( !entries.hasNext() ) { return -1; } - final MutationOperationGroup operationGroup = resolveInsertGroup(); - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( + final var operationGroup = resolveInsertGroup(); + final var mutationExecutor = mutationExecutorService.createExecutor( () -> new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-INSERT" ), operationGroup, session ); try { - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); - + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); int entryPosition = -1; - while ( entries.hasNext() ) { final Object entry = entries.next(); entryPosition++; - - if ( !collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { - continue; + if ( collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { + rowMutationOperations.getInsertRowValues().applyValues( + collection, + key, + entry, + entryPosition, + session, + jdbcValueBindings + ); + + mutationExecutor.execute( entry, null, null, null, session ); } - - rowMutationOperations.getInsertRowValues().applyValues( - collection, - key, - entry, - entryPosition, - session, - jdbcValueBindings - ); - - mutationExecutor.execute( entry, null, null, null, session ); } - return entryPosition; } finally { @@ -155,12 +134,10 @@ private int insertRows(Object key, PersistentCollection collection, SharedSes private MutationOperationGroup resolveInsertGroup() { if ( insertOperationGroup == null ) { - final JdbcMutationOperation operation = rowMutationOperations.getInsertRowOperation(); + final var operation = rowMutationOperations.getInsertRowOperation(); assert operation != null; - - insertOperationGroup = MutationOperationGroupFactory.singleOperation( MutationType.INSERT, getMutationTarget(), operation ); + insertOperationGroup = singleOperation( MutationType.INSERT, getMutationTarget(), operation ); } - return insertOperationGroup; } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorStandard.java index 0fde9690d905..473cf8c99503 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorStandard.java @@ -5,19 +5,18 @@ package org.hibernate.persister.collection.mutation; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; + +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.noOperations; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * UpdateRowsCoordinator implementation for cases with a separate collection table @@ -41,17 +40,17 @@ public UpdateRowsCoordinatorStandard( @Override protected int doUpdate(Object key, PersistentCollection collection, SharedSessionContractImplementor session) { - final MutationOperationGroup operationGroup = getOperationGroup(); + final var operationGroup = getOperationGroup(); - final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor( + final var mutationExecutor = mutationExecutorService.createExecutor( () -> new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE" ), operationGroup, session ); try { - final Iterator entries = collection.entries( getMutationTarget().getTargetPart() - .getCollectionDescriptor() ); + final var entries = + collection.entries( getMutationTarget().getTargetPart().getCollectionDescriptor() ); int count = 0; if ( collection.isElementRemoved() ) { @@ -110,7 +109,7 @@ private boolean processRow( MutationExecutor mutationExecutor, SharedSessionContractImplementor session) { if ( rowMutationOperations.getUpdateRowOperation() != null ) { - final PluralAttributeMapping attribute = getMutationTarget().getTargetPart(); + final var attribute = getMutationTarget().getTargetPart(); if ( !collection.needsUpdating( entry, entryPosition, attribute ) ) { return false; } @@ -143,13 +142,10 @@ private boolean processRow( protected MutationOperationGroup getOperationGroup() { if ( operationGroup == null ) { - final JdbcMutationOperation updateRowOperation = rowMutationOperations.getUpdateRowOperation(); - if ( updateRowOperation == null ) { - operationGroup = MutationOperationGroupFactory.noOperations( MutationType.UPDATE, getMutationTarget() ); - } - else { - operationGroup = MutationOperationGroupFactory.singleOperation( MutationType.UPDATE, getMutationTarget(), updateRowOperation ); - } + final var updateRowOperation = rowMutationOperations.getUpdateRowOperation(); + operationGroup = updateRowOperation == null + ? noOperations( MutationType.UPDATE, getMutationTarget() ) + : singleOperation( MutationType.UPDATE, getMutationTarget(), updateRowOperation ); } return operationGroup; } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorTablePerSubclass.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorTablePerSubclass.java index 5799279a4a2e..a4db0625ec05 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorTablePerSubclass.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/UpdateRowsCoordinatorTablePerSubclass.java @@ -4,23 +4,19 @@ */ package org.hibernate.persister.collection.mutation; -import java.util.Iterator; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; import org.hibernate.engine.jdbc.mutation.MutationExecutor; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess; -import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.collection.OneToManyPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.jdbc.JdbcMutationOperation; + +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * OneToMany update coordinator if the element is a {@link org.hibernate.persister.entity.UnionSubclassEntityPersister}. @@ -37,8 +33,11 @@ public UpdateRowsCoordinatorTablePerSubclass( SessionFactoryImplementor sessionFactory) { super( mutationTarget, sessionFactory ); this.rowMutationOperations = rowMutationOperations; - this.deleteSubclassEntries = new SubclassEntry[mutationTarget.getElementPersister().getRootEntityDescriptor().getSubclassEntityNames().size()]; - this.insertSubclassEntries = new SubclassEntry[mutationTarget.getElementPersister().getRootEntityDescriptor().getSubclassEntityNames().size()]; + final int size = + mutationTarget.getElementPersister().getRootEntityDescriptor() + .getSubclassEntityNames().size(); + deleteSubclassEntries = new SubclassEntry[size]; + insertSubclassEntries = new SubclassEntry[size]; } @Override @@ -55,56 +54,50 @@ protected int doUpdate(Object key, PersistentCollection collection, SharedSes } private void deleteRows(Object key, PersistentCollection collection, SharedSessionContractImplementor session) { - final PluralAttributeMapping attributeMapping = getMutationTarget().getTargetPart(); - final CollectionPersister collectionDescriptor = attributeMapping.getCollectionDescriptor(); - final Iterator entries = collection.entries( collectionDescriptor ); - if ( !entries.hasNext() ) { - return; - } - - final MutationExecutor[] executors = new MutationExecutor[deleteSubclassEntries.length]; - try { - int entryPosition = -1; - - while ( entries.hasNext() ) { - final Object entry = entries.next(); - entryPosition++; - - if ( !collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { - continue; - } - final Object entryToUpdate = collection.getSnapshotElement( entry, entryPosition ); - - final EntityEntry entityEntry = session.getPersistenceContextInternal().getEntry( entryToUpdate ); - final int subclassId = entityEntry.getPersister().getSubclassId(); - final MutationExecutor mutationExecutor; - if ( executors[subclassId] == null ) { - final SubclassEntry subclassEntry = getDeleteSubclassEntry( entityEntry.getPersister() ); - mutationExecutor = executors[subclassId] = mutationExecutorService.createExecutor( - subclassEntry.batchKeySupplier, - subclassEntry.operationGroup, - session - ); - } - else { - mutationExecutor = executors[subclassId]; + final var attributeMapping = getMutationTarget().getTargetPart(); + final var collectionDescriptor = attributeMapping.getCollectionDescriptor(); + final var entries = collection.entries( collectionDescriptor ); + if ( entries.hasNext() ) { + final var executors = new MutationExecutor[deleteSubclassEntries.length]; + try { + int entryPosition = -1; + while ( entries.hasNext() ) { + final Object entry = entries.next(); + entryPosition++; + if ( collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { + final Object entryToUpdate = collection.getSnapshotElement( entry, entryPosition ); + final var entityEntry = session.getPersistenceContextInternal().getEntry( entryToUpdate ); + final int subclassId = entityEntry.getPersister().getSubclassId(); + final MutationExecutor mutationExecutor; + if ( executors[subclassId] == null ) { + final var subclassEntry = getDeleteSubclassEntry( entityEntry.getPersister() ); + mutationExecutor = executors[subclassId] = mutationExecutorService.createExecutor( + subclassEntry.batchKeySupplier, + subclassEntry.operationGroup, + session + ); + } + else { + mutationExecutor = executors[subclassId]; + } + rowMutationOperations.getDeleteRowRestrictions().applyRestrictions( + collection, + key, + entryToUpdate, + entryPosition, + session, + mutationExecutor.getJdbcValueBindings() + ); + + mutationExecutor.execute( entryToUpdate, null, null, null, session ); + } } - rowMutationOperations.getDeleteRowRestrictions().applyRestrictions( - collection, - key, - entryToUpdate, - entryPosition, - session, - mutationExecutor.getJdbcValueBindings() - ); - - mutationExecutor.execute( entryToUpdate, null, null, null, session ); } - } - finally { - for ( MutationExecutor executor : executors ) { - if ( executor != null ) { - executor.release(); + finally { + for ( var executor : executors ) { + if ( executor != null ) { + executor.release(); + } } } } @@ -112,11 +105,11 @@ private void deleteRows(Object key, PersistentCollection collection, SharedSe private SubclassEntry getDeleteSubclassEntry( EntityPersister elementPersister) { final int subclassId = elementPersister.getSubclassId(); - final SubclassEntry subclassEntry = deleteSubclassEntries[subclassId]; + final var subclassEntry = deleteSubclassEntries[subclassId]; if ( subclassEntry != null ) { return subclassEntry; } - final BasicBatchKey basicBatchKey = new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-DELETE#" + subclassId ); + final var basicBatchKey = new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-DELETE#" + subclassId ); return deleteSubclassEntries[subclassId] = new SubclassEntry( () -> basicBatchKey, resolveDeleteGroup( elementPersister ) @@ -124,8 +117,8 @@ private SubclassEntry getDeleteSubclassEntry( EntityPersister elementPersister) } private MutationOperationGroup resolveDeleteGroup(EntityPersister elementPersister) { - final CollectionTableMapping collectionTableMapping = getMutationTarget().getCollectionTableMapping(); - final JdbcMutationOperation operation = rowMutationOperations.getDeleteRowOperation( + final var collectionTableMapping = getMutationTarget().getCollectionTableMapping(); + final var operation = rowMutationOperations.getDeleteRowOperation( new CollectionTableMapping( elementPersister.getMappedTableDetails().getTableName(), collectionTableMapping.getSpaces(), @@ -139,59 +132,53 @@ private MutationOperationGroup resolveDeleteGroup(EntityPersister elementPersist ) ); - return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, getMutationTarget(), operation ); + return singleOperation( MutationType.DELETE, getMutationTarget(), operation ); } private int insertRows(Object key, PersistentCollection collection, SharedSessionContractImplementor session) { - final PluralAttributeMapping attributeMapping = getMutationTarget().getTargetPart(); - final CollectionPersister collectionDescriptor = attributeMapping.getCollectionDescriptor(); - final Iterator entries = collection.entries( collectionDescriptor ); + final var attributeMapping = getMutationTarget().getTargetPart(); + final var collectionDescriptor = attributeMapping.getCollectionDescriptor(); + final var entries = collection.entries( collectionDescriptor ); if ( !entries.hasNext() ) { return -1; } - final MutationExecutor[] executors = new MutationExecutor[insertSubclassEntries.length]; + final var executors = new MutationExecutor[insertSubclassEntries.length]; try { int entryPosition = -1; - while ( entries.hasNext() ) { final Object entry = entries.next(); entryPosition++; - - if ( !collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { - continue; - } - - final EntityEntry entityEntry = session.getPersistenceContextInternal().getEntry( entry ); - final int subclassId = entityEntry.getPersister().getSubclassId(); - final MutationExecutor mutationExecutor; - if ( executors[subclassId] == null ) { - final SubclassEntry subclassEntry = getInsertSubclassEntry( entityEntry.getPersister() ); - mutationExecutor = executors[subclassId] = mutationExecutorService.createExecutor( - subclassEntry.batchKeySupplier, - subclassEntry.operationGroup, - session + if ( collection.needsUpdating( entry, entryPosition, attributeMapping ) ) { + final var entityEntry = session.getPersistenceContextInternal().getEntry( entry ); + final int subclassId = entityEntry.getPersister().getSubclassId(); + final MutationExecutor mutationExecutor; + if ( executors[subclassId] == null ) { + final var subclassEntry = getInsertSubclassEntry( entityEntry.getPersister() ); + mutationExecutor = executors[subclassId] = mutationExecutorService.createExecutor( + subclassEntry.batchKeySupplier, + subclassEntry.operationGroup, + session + ); + } + else { + mutationExecutor = executors[subclassId]; + } + rowMutationOperations.getInsertRowValues().applyValues( + collection, + key, + entry, + entryPosition, + session, + mutationExecutor.getJdbcValueBindings() ); + mutationExecutor.execute( entry, null, null, null, session ); } - else { - mutationExecutor = executors[subclassId]; - } - rowMutationOperations.getInsertRowValues().applyValues( - collection, - key, - entry, - entryPosition, - session, - mutationExecutor.getJdbcValueBindings() - ); - - mutationExecutor.execute( entry, null, null, null, session ); } - return entryPosition; } finally { - for ( MutationExecutor executor : executors ) { + for ( var executor : executors ) { if ( executor != null ) { executor.release(); } @@ -201,20 +188,23 @@ private int insertRows(Object key, PersistentCollection collection, SharedSes private SubclassEntry getInsertSubclassEntry( EntityPersister elementPersister) { final int subclassId = elementPersister.getSubclassId(); - final SubclassEntry subclassEntry = insertSubclassEntries[subclassId]; + final var subclassEntry = insertSubclassEntries[subclassId]; if ( subclassEntry != null ) { return subclassEntry; } - final BasicBatchKey basicBatchKey = new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-INSERT#" + subclassId ); - return insertSubclassEntries[subclassId] = new SubclassEntry( - () -> basicBatchKey, - resolveInsertGroup( elementPersister ) - ); + else { + final var basicBatchKey = + new BasicBatchKey( getMutationTarget().getRolePath() + "#UPDATE-INSERT#" + subclassId ); + return insertSubclassEntries[subclassId] = new SubclassEntry( + () -> basicBatchKey, + resolveInsertGroup( elementPersister ) + ); + } } private MutationOperationGroup resolveInsertGroup(EntityPersister elementPersister) { - final CollectionTableMapping collectionTableMapping = getMutationTarget().getCollectionTableMapping(); - final JdbcMutationOperation operation = rowMutationOperations.getInsertRowOperation( + final var collectionTableMapping = getMutationTarget().getCollectionTableMapping(); + final var operation = rowMutationOperations.getInsertRowOperation( new CollectionTableMapping( elementPersister.getMappedTableDetails().getTableName(), collectionTableMapping.getSpaces(), @@ -228,7 +218,7 @@ private MutationOperationGroup resolveInsertGroup(EntityPersister elementPersist ) ); - return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, getMutationTarget(), operation ); + return singleOperation( MutationType.INSERT, getMutationTarget(), operation ); } private static class SubclassEntry { diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractDeleteCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractDeleteCoordinator.java index 44012b9c36e6..6ca1007386eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractDeleteCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractDeleteCoordinator.java @@ -6,19 +6,14 @@ import org.hibernate.StaleObjectStateException; import org.hibernate.StaleStateException; -import org.hibernate.engine.OptimisticLockStyle; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; import org.hibernate.engine.jdbc.mutation.MutationExecutor; import org.hibernate.engine.jdbc.mutation.ParameterUsage; import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails; -import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.mapping.AttributeMapping; -import org.hibernate.metamodel.mapping.EntityVersionMapping; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.MutationOperationGroup; import static org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.identifiedResultsCheck; @@ -42,8 +37,8 @@ public AbstractDeleteCoordinator( SessionFactoryImplementor factory) { super( entityPersister, factory ); - this.batchKey = new BasicBatchKey( entityPersister.getEntityName() + "#DELETE" ); - this.staticOperationGroup = generateOperationGroup( "", null, true, null ); + batchKey = new BasicBatchKey( entityPersister.getEntityName() + "#DELETE" ); + staticOperationGroup = generateOperationGroup( "", null, true, null ); if ( !entityPersister.isVersioned() ) { noVersionDeleteGroup = staticOperationGroup; } @@ -71,10 +66,10 @@ public void delete( Object id, Object version, SharedSessionContractImplementor session) { - boolean isImpliedOptimisticLocking = entityPersister().optimisticLockStyle().isAllOrDirty(); + final boolean isImpliedOptimisticLocking = entityPersister().optimisticLockStyle().isAllOrDirty(); - final EntityEntry entry = session.getPersistenceContextInternal().getEntry( entity ); - final Object[] loadedState = entry != null && isImpliedOptimisticLocking ? entry.getLoadedState() : null; + final var entry = session.getPersistenceContextInternal().getEntry( entity ); + final var loadedState = entry != null && isImpliedOptimisticLocking ? entry.getLoadedState() : null; final Object rowId = entry != null ? entry.getRowId() : null; if ( isImpliedOptimisticLocking && loadedState != null || rowId == null && entityPersister().hasRowId() ) { @@ -91,12 +86,12 @@ protected void doDynamicDelete( Object rowId, Object[] loadedState, SharedSessionContractImplementor session) { - final MutationOperationGroup operationGroup = + final var operationGroup = generateOperationGroup( null, loadedState, true, session ); - final MutationExecutor mutationExecutor = executor( session, operationGroup ); + final var mutationExecutor = executor( session, operationGroup ); for ( int i = 0; i < operationGroup.getNumberOfOperations(); i++ ) { - final MutationOperation mutation = operationGroup.getOperation( i ); + final var mutation = operationGroup.getOperation( i ); if ( mutation != null ) { final String tableName = mutation.getTableDetails().getTableName(); mutationExecutor.getPreparedStatementDetails( tableName ); @@ -144,9 +139,8 @@ protected void applyLocking( Object[] loadedState, MutationExecutor mutationExecutor, SharedSessionContractImplementor session) { - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); - final OptimisticLockStyle optimisticLockStyle = entityPersister().optimisticLockStyle(); - switch ( optimisticLockStyle ) { + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + switch ( entityPersister().optimisticLockStyle() ) { case VERSION: applyVersionLocking( version, jdbcValueBindings ); break; @@ -162,12 +156,12 @@ private void applyAllOrDirtyLocking( SharedSessionContractImplementor session, JdbcValueBindings jdbcValueBindings) { if ( loadedState != null ) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); final boolean[] versionability = persister.getPropertyVersionability(); for ( int attributeIndex = 0; attributeIndex < versionability.length; attributeIndex++ ) { // only makes sense to lock on singular attributes which are not excluded from optimistic locking if ( versionability[attributeIndex] ) { - final AttributeMapping attribute = persister.getAttributeMapping( attributeIndex ); + final var attribute = persister.getAttributeMapping( attributeIndex ); if ( !attribute.isPluralAttributeMapping() ) { final Object loadedValue = loadedState[attributeIndex]; if ( loadedValue != null ) { @@ -200,8 +194,8 @@ private void applyAllOrDirtyLocking( private void applyVersionLocking( Object version, JdbcValueBindings jdbcValueBindings) { - final EntityPersister persister = entityPersister(); - final EntityVersionMapping versionMapping = persister.getVersionMapping(); + final var persister = entityPersister(); + final var versionMapping = persister.getVersionMapping(); if ( version != null && versionMapping != null ) { jdbcValueBindings.bindValue( version, @@ -218,14 +212,13 @@ protected void applyId( MutationExecutor mutationExecutor, MutationOperationGroup operationGroup, SharedSessionContractImplementor session) { - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); // final EntityRowIdMapping rowIdMapping = entityPersister().getRowIdMapping(); - for ( int position = 0; position < operationGroup.getNumberOfOperations(); position++ ) { - final MutationOperation jdbcMutation = operationGroup.getOperation( position ); - final EntityTableMapping tableDetails = (EntityTableMapping) jdbcMutation.getTableDetails(); + final var jdbcMutation = operationGroup.getOperation( position ); + final var tableDetails = (EntityTableMapping) jdbcMutation.getTableDetails(); breakDownKeyJdbcValues( id, rowId, session, jdbcValueBindings, tableDetails ); - final PreparedStatementDetails statementDetails = + final var statementDetails = mutationExecutor.getPreparedStatementDetails( tableDetails.getTableName() ); if ( statementDetails != null ) { // force creation of the PreparedStatement @@ -253,9 +246,9 @@ protected void doStaticDelete( operationGroupToUse = staticOperationGroup; } - final MutationExecutor mutationExecutor = executor( session, operationGroupToUse ); + final var mutationExecutor = executor( session, operationGroupToUse ); for ( int position = 0; position < staticOperationGroup.getNumberOfOperations(); position++ ) { - final MutationOperation mutation = staticOperationGroup.getOperation( position ); + final var mutation = staticOperationGroup.getOperation( position ); if ( mutation != null ) { mutationExecutor.getPreparedStatementDetails( mutation.getTableDetails().getTableName() ); } @@ -315,7 +308,7 @@ protected void applyStaticDeleteTableDetails( applyLocking( version, null, mutationExecutor, session ); } - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); bindPartitionColumnValueBindings( loadedState, session, jdbcValueBindings ); applyId( id, rowId, mutationExecutor, staticOperationGroup, session ); @@ -329,7 +322,6 @@ protected MutationOperationGroup resolveNoVersionDeleteGroup(SharedSessionContra if ( noVersionDeleteGroup == null ) { noVersionDeleteGroup = generateOperationGroup( "", null, false, session ); } - return noVersionDeleteGroup; } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java index a03e128970bb..9c80593e111f 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java @@ -16,7 +16,6 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.OnExecutionGenerator; import org.hibernate.metamodel.mapping.AttributeMapping; -import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.MutationOperationGroup; @@ -26,9 +25,12 @@ import org.hibernate.sql.model.ast.builder.ColumnValuesTableMutationBuilder; import org.hibernate.sql.model.ast.builder.MutationGroupBuilder; import org.hibernate.sql.model.ast.builder.RestrictedTableMutationBuilder; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; +import static java.lang.System.arraycopy; import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.manyOperations; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.noOperations; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** @@ -50,7 +52,7 @@ public AbstractMutationCoordinator(EntityPersister entityPersister, SessionFacto this.entityPersister = entityPersister; this.factory = factory; dialect = factory.getJdbcServices().getDialect(); - this.mutationExecutorService = factory.getServiceRegistry().getService( MutationExecutorService.class ); + mutationExecutorService = factory.getServiceRegistry().getService( MutationExecutorService.class ); } protected EntityPersister entityPersister() { @@ -82,20 +84,20 @@ protected MutationOperationGroup createOperationGroup(ValuesAnalysis valuesAnaly final int numberOfTableMutations = mutationGroup.getNumberOfTableMutations(); switch ( numberOfTableMutations ) { case 0: - return MutationOperationGroupFactory.noOperations( mutationGroup ); + return noOperations( mutationGroup ); case 1: { - final MutationOperation operation = createOperation( valuesAnalysis, mutationGroup.getSingleTableMutation() ); + final var operation = createOperation( valuesAnalysis, mutationGroup.getSingleTableMutation() ); return operation == null - ? MutationOperationGroupFactory.noOperations( mutationGroup ) - : MutationOperationGroupFactory.singleOperation( mutationGroup, operation ); + ? noOperations( mutationGroup ) + : singleOperation( mutationGroup, operation ); } default: { - MutationOperation[] operations = new MutationOperation[numberOfTableMutations]; + var operations = new MutationOperation[numberOfTableMutations]; int outputIndex = 0; int skipped = 0; for ( int i = 0; i < mutationGroup.getNumberOfTableMutations(); i++ ) { - final TableMutation tableMutation = mutationGroup.getTableMutation( i ); - final MutationOperation operation = tableMutation.createMutationOperation( valuesAnalysis, factory ); + final var tableMutation = mutationGroup.getTableMutation( i ); + final var operation = tableMutation.createMutationOperation( valuesAnalysis, factory ); if ( operation != null ) { operations[outputIndex++] = operation; } @@ -105,11 +107,11 @@ protected MutationOperationGroup createOperationGroup(ValuesAnalysis valuesAnaly } } if ( skipped != 0 ) { - final MutationOperation[] trimmed = new MutationOperation[outputIndex]; - System.arraycopy( operations, 0, trimmed, 0, outputIndex ); + final var trimmed = new MutationOperation[outputIndex]; + arraycopy( operations, 0, trimmed, 0, outputIndex ); operations = trimmed; } - return MutationOperationGroupFactory.manyOperations( mutationGroup.getMutationType(), entityPersister, operations ); + return manyOperations( mutationGroup.getMutationType(), entityPersister, operations ); } } } @@ -130,7 +132,8 @@ protected void handleValueGeneration( final String[] columnValues = writePropertyValue ? null : generator.getReferencedColumnValues( dialect ); attributeMapping.forEachSelectable( (j, mapping) -> { final String tableName = entityPersister.physicalTableNameForMutation( mapping ); - final ColumnValuesTableMutationBuilder tableUpdateBuilder = mutationGroupBuilder.findTableDetailsBuilder( tableName ); + final ColumnValuesTableMutationBuilder tableUpdateBuilder = + mutationGroupBuilder.findTableDetailsBuilder( tableName ); tableUpdateBuilder.addValueColumn( writePropertyValue ? "?" : columnValues[j], mapping @@ -142,12 +145,12 @@ protected void bindPartitionColumnValueBindings( Object[] loadedState, SharedSessionContractImplementor session, JdbcValueBindings jdbcValueBindings) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + final var attributeMappings = persister.getAttributeMappings(); final int size = attributeMappings.size(); for ( int i = 0; i < size; i++ ) { - final AttributeMapping attributeMapping = attributeMappings.get( i ); + final var attributeMapping = attributeMappings.get( i ); if ( attributeMapping.hasPartitionedSelectionMapping() ) { attributeMapping.decompose( loadedState[i], @@ -171,7 +174,8 @@ protected void bindPartitionColumnValueBindings( } protected static boolean needsRowId(EntityPersister entityPersister, EntityTableMapping tableMapping) { - return entityPersister.getRowIdMapping() != null && tableMapping.isIdentifierTable(); + return entityPersister.getRowIdMapping() != null + && tableMapping.isIdentifierTable(); } protected static void applyKeyRestriction( diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorSoft.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorSoft.java index 67eeddf86ca1..7630096018ea 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorSoft.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorSoft.java @@ -8,20 +8,17 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; -import org.hibernate.metamodel.mapping.AttributeMappingsList; -import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SoftDeleteMapping; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.ast.ColumnValueBindingList; -import org.hibernate.sql.model.ast.RestrictedTableMutation; import org.hibernate.sql.model.ast.builder.TableUpdateBuilder; import org.hibernate.sql.model.ast.builder.TableUpdateBuilderStandard; import org.hibernate.sql.model.internal.MutationGroupSingle; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; + +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.singleOperation; /** * DeleteCoordinator for soft-deletes @@ -39,7 +36,7 @@ protected MutationOperationGroup generateOperationGroup( Object[] loadedState, boolean applyVersion, SharedSessionContractImplementor session) { - final EntityTableMapping rootTableMapping = entityPersister().getIdentifierTableMapping(); + final var rootTableMapping = entityPersister().getIdentifierTableMapping(); final TableUpdateBuilderStandard tableUpdateBuilder = new TableUpdateBuilderStandard<>( entityPersister(), rootTableMapping, @@ -51,26 +48,26 @@ protected MutationOperationGroup generateOperationGroup( applyPartitionKeyRestriction( tableUpdateBuilder ); applyOptimisticLocking( tableUpdateBuilder, loadedState, session ); - final RestrictedTableMutation tableMutation = tableUpdateBuilder.buildMutation(); + final var tableMutation = tableUpdateBuilder.buildMutation(); final MutationGroupSingle mutationGroup = new MutationGroupSingle( MutationType.DELETE, entityPersister(), tableMutation ); - final MutationOperation mutationOperation = tableMutation.createMutationOperation( null, factory() ); - return MutationOperationGroupFactory.singleOperation( mutationGroup, mutationOperation ); + final var mutationOperation = tableMutation.createMutationOperation( null, factory() ); + return singleOperation( mutationGroup, mutationOperation ); } private void applyPartitionKeyRestriction(TableUpdateBuilder tableUpdateBuilder) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + final var attributeMappings = persister.getAttributeMappings(); for ( int m = 0; m < attributeMappings.size(); m++ ) { - final AttributeMapping attributeMapping = attributeMappings.get( m ); + final var attributeMapping = attributeMappings.get( m ); final int jdbcTypeCount = attributeMapping.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { - final SelectableMapping selectableMapping = attributeMapping.getSelectable( i ); + final var selectableMapping = attributeMapping.getSelectable( i ); if ( selectableMapping.isPartitioned() ) { tableUpdateBuilder.addKeyRestrictionLeniently( selectableMapping ); } @@ -82,7 +79,7 @@ private void applyPartitionKeyRestriction(TableUpdateBuilder tableUpdateBuild private void applySoftDelete( SoftDeleteMapping softDeleteMapping, TableUpdateBuilderStandard tableUpdateBuilder) { - final ColumnReference softDeleteColumnReference = new ColumnReference( tableUpdateBuilder.getMutatingTable(), softDeleteMapping ); + final var softDeleteColumnReference = new ColumnReference( tableUpdateBuilder.getMutatingTable(), softDeleteMapping ); // apply the assignment tableUpdateBuilder.addValueColumn( softDeleteMapping.createDeletedValueBinding( softDeleteColumnReference ) ); @@ -94,11 +91,12 @@ protected void applyOptimisticLocking( TableUpdateBuilderStandard tableUpdateBuilder, Object[] loadedState, SharedSessionContractImplementor session) { - final OptimisticLockStyle optimisticLockStyle = entityPersister().optimisticLockStyle(); - if ( optimisticLockStyle.isVersion() && entityPersister().getVersionMapping() != null ) { + final var persister = entityPersister(); + final var optimisticLockStyle = persister.optimisticLockStyle(); + if ( optimisticLockStyle.isVersion() && persister.getVersionMapping() != null ) { applyVersionBasedOptLocking( tableUpdateBuilder ); } - else if ( loadedState != null && entityPersister().optimisticLockStyle().isAllOrDirty() ) { + else if ( loadedState != null && persister.optimisticLockStyle().isAllOrDirty() ) { applyNonVersionOptLocking( optimisticLockStyle, tableUpdateBuilder, @@ -120,7 +118,7 @@ protected void applyNonVersionOptLocking( TableUpdateBuilderStandard tableUpdateBuilder, Object[] loadedState, SharedSessionContractImplementor session) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); assert loadedState != null; assert lockStyle.isAllOrDirty(); assert persister.optimisticLockStyle().isAllOrDirty(); @@ -128,11 +126,12 @@ protected void applyNonVersionOptLocking( final boolean[] versionability = persister.getPropertyVersionability(); for ( int attributeIndex = 0; attributeIndex < versionability.length; attributeIndex++ ) { - final AttributeMapping attribute; // only makes sense to lock on singular attributes which are not excluded from optimistic locking - if ( versionability[attributeIndex] - && !( attribute = persister.getAttributeMapping( attributeIndex ) ).isPluralAttributeMapping() ) { - breakDownJdbcValues( tableUpdateBuilder, session, attribute, loadedState[attributeIndex] ); + if ( versionability[attributeIndex] ) { + final var attribute = persister.getAttributeMapping( attributeIndex ); + if ( !attribute.isPluralAttributeMapping() ) { + breakDownJdbcValues( tableUpdateBuilder, session, attribute, loadedState[attributeIndex] ); + } } } } @@ -142,29 +141,25 @@ private void breakDownJdbcValues( SharedSessionContractImplementor session, AttributeMapping attribute, Object loadedValue) { - if ( !tableUpdateBuilder.getMutatingTable() - .getTableName() + if ( tableUpdateBuilder.getMutatingTable().getTableName() .equals( attribute.getContainingTableExpression() ) ) { - // it is not on the root table, skip it - return; - } - - final ColumnValueBindingList optimisticLockBindings = tableUpdateBuilder.getOptimisticLockBindings(); - if ( optimisticLockBindings != null ) { - attribute.breakDownJdbcValues( - loadedValue, - (valueIndex, value, jdbcValueMapping) -> { - if ( !tableUpdateBuilder.getKeyRestrictionBindings() - .containsColumn( - jdbcValueMapping.getSelectableName(), - jdbcValueMapping.getJdbcMapping() - ) ) { - optimisticLockBindings.consume( valueIndex, value, jdbcValueMapping ); - } - } - , - session - ); + final var optimisticLockBindings = tableUpdateBuilder.getOptimisticLockBindings(); + if ( optimisticLockBindings != null ) { + attribute.breakDownJdbcValues( + loadedValue, + (valueIndex, value, jdbcValueMapping) -> { + if ( !tableUpdateBuilder.getKeyRestrictionBindings() + .containsColumn( + jdbcValueMapping.getSelectableName(), + jdbcValueMapping.getJdbcMapping() + ) ) { + optimisticLockBindings.consume( valueIndex, value, jdbcValueMapping ); + } + }, + session + ); + } } + // else if it is not on the root table, skip it } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorStandard.java index c4de80232301..7eeb0affec71 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinatorStandard.java @@ -8,12 +8,9 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; -import org.hibernate.metamodel.mapping.AttributeMappingsList; -import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; -import org.hibernate.sql.model.ast.ColumnValueBindingList; import org.hibernate.sql.model.ast.builder.MutationGroupBuilder; import org.hibernate.sql.model.ast.builder.RestrictedTableMutationBuilder; import org.hibernate.sql.model.ast.builder.TableDeleteBuilder; @@ -37,10 +34,10 @@ protected MutationOperationGroup generateOperationGroup( Object[] loadedState, boolean applyVersion, SharedSessionContractImplementor session) { - final MutationGroupBuilder deleteGroupBuilder = new MutationGroupBuilder( MutationType.DELETE, entityPersister() ); + final var deleteGroupBuilder = new MutationGroupBuilder( MutationType.DELETE, entityPersister() ); entityPersister().forEachMutableTableReverse( (tableMapping) -> { - final TableDeleteBuilder tableDeleteBuilder = tableMapping.isCascadeDeleteEnabled() + final var tableDeleteBuilder = tableMapping.isCascadeDeleteEnabled() ? new TableDeleteBuilderSkipped( tableMapping ) : new TableDeleteBuilderStandard( entityPersister(), tableMapping, factory() ); deleteGroupBuilder.addTableDetailsBuilder( tableDeleteBuilder ); @@ -59,22 +56,22 @@ private void applyTableDeleteDetails( SharedSessionContractImplementor session) { // first, the table key column(s) deleteGroupBuilder.forEachTableMutationBuilder( (builder) -> { - final EntityTableMapping tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); - final TableDeleteBuilder tableDeleteBuilder = (TableDeleteBuilder) builder; + final var tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); + final var tableDeleteBuilder = (TableDeleteBuilder) builder; applyKeyRestriction( rowId, entityPersister(), tableDeleteBuilder, tableMapping ); } ); if ( applyVersion ) { // apply any optimistic locking applyOptimisticLocking( deleteGroupBuilder, loadedState, session ); - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + final var attributeMappings = persister.getAttributeMappings(); for ( int m = 0; m < attributeMappings.size(); m++ ) { - final AttributeMapping attributeMapping = attributeMappings.get( m ); + final var attributeMapping = attributeMappings.get( m ); final int jdbcTypeCount = attributeMapping.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { - final SelectableMapping selectableMapping = attributeMapping.getSelectable( i ); + final var selectableMapping = attributeMapping.getSelectable( i ); if ( selectableMapping.isPartitioned() ) { final String tableNameForMutation = persister.physicalTableNameForMutation( selectableMapping ); @@ -92,7 +89,7 @@ protected void applyOptimisticLocking( MutationGroupBuilder mutationGroupBuilder, Object[] loadedState, SharedSessionContractImplementor session) { - final OptimisticLockStyle optimisticLockStyle = entityPersister().optimisticLockStyle(); + final var optimisticLockStyle = entityPersister().optimisticLockStyle(); if ( optimisticLockStyle.isVersion() && entityPersister().getVersionMapping() != null ) { applyVersionBasedOptLocking( mutationGroupBuilder ); } @@ -110,8 +107,10 @@ protected void applyVersionBasedOptLocking(MutationGroupBuilder mutationGroupBui assert entityPersister().optimisticLockStyle() == OptimisticLockStyle.VERSION; assert entityPersister().getVersionMapping() != null; - final String tableNameForMutation = entityPersister().physicalTableNameForMutation( entityPersister().getVersionMapping() ); - final RestrictedTableMutationBuilder rootTableMutationBuilder = mutationGroupBuilder.findTableDetailsBuilder( tableNameForMutation ); + final String tableNameForMutation = + entityPersister().physicalTableNameForMutation( entityPersister().getVersionMapping() ); + final RestrictedTableMutationBuilder rootTableMutationBuilder = + mutationGroupBuilder.findTableDetailsBuilder( tableNameForMutation ); rootTableMutationBuilder.addOptimisticLockRestriction( entityPersister().getVersionMapping() ); } @@ -120,7 +119,7 @@ protected void applyNonVersionOptLocking( MutationGroupBuilder mutationGroupBuilder, Object[] loadedState, SharedSessionContractImplementor session) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); assert loadedState != null; assert lockStyle.isAllOrDirty(); assert persister.optimisticLockStyle().isAllOrDirty(); @@ -128,10 +127,12 @@ protected void applyNonVersionOptLocking( final boolean[] versionability = persister.getPropertyVersionability(); for ( int attributeIndex = 0; attributeIndex < versionability.length; attributeIndex++ ) { - final AttributeMapping attribute; // only makes sense to lock on singular attributes which are not excluded from optimistic locking - if ( versionability[attributeIndex] && !( attribute = persister.getAttributeMapping( attributeIndex ) ).isPluralAttributeMapping() ) { - breakDownJdbcValues( mutationGroupBuilder, session, attribute, loadedState[attributeIndex] ); + if ( versionability[attributeIndex] ) { + final var attribute = persister.getAttributeMapping( attributeIndex ); + if ( !attribute.isPluralAttributeMapping() ) { + breakDownJdbcValues( mutationGroupBuilder, session, attribute, loadedState[attributeIndex] ); + } } } } @@ -144,7 +145,7 @@ private void breakDownJdbcValues( final RestrictedTableMutationBuilder tableMutationBuilder = mutationGroupBuilder.findTableDetailsBuilder( attribute.getContainingTableExpression() ); if ( tableMutationBuilder != null ) { - final ColumnValueBindingList optimisticLockBindings = tableMutationBuilder.getOptimisticLockBindings(); + final var optimisticLockBindings = tableMutationBuilder.getOptimisticLockBindings(); if ( optimisticLockBindings != null ) { attribute.breakDownJdbcValues( loadedValue, diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/EntityTableMapping.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/EntityTableMapping.java index b348f4778771..cfa3f7873687 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/EntityTableMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/EntityTableMapping.java @@ -4,8 +4,8 @@ */ package org.hibernate.persister.entity.mutation; +import org.hibernate.AssertionFailure; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.jdbc.Expectation; import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; @@ -17,7 +17,6 @@ import org.hibernate.metamodel.mapping.internal.SelectableMappingImpl; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlAstCreationState; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.model.MutationType; @@ -30,6 +29,8 @@ import java.util.List; import java.util.Objects; +import static org.hibernate.internal.util.collections.ArrayHelper.contains; + /** * Descriptor for the mapping of a table relative to an entity * @@ -151,7 +152,7 @@ public boolean hasColumns() { } public boolean containsAttributeColumns(int attributeIndex) { - return ArrayHelper.contains( attributeIndexes, attributeIndex ); + return contains( attributeIndexes, attributeIndex ); } public int[] getAttributeIndexes() { @@ -211,15 +212,16 @@ public boolean isDeleteCallable() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !(object instanceof EntityTableMapping that) ) { return false; } - final EntityTableMapping that = (EntityTableMapping) o; - return tableName.equals( that.tableName ); + else { + return tableName.equals( that.tableName ); + } } @Override @@ -239,9 +241,12 @@ public static KeyMapping createKeyMapping(List keyColumns, ModelPart if ( identifierPart instanceof EmbeddableValuedModelPart embeddedModelPart ) { return new CompositeKeyMapping( keyColumns, embeddedModelPart ); } - else { + else if ( identifierPart instanceof BasicValuedModelPart basicModelPart ) { assert keyColumns.size() == 1; - return new SimpleKeyMapping( keyColumns, (BasicValuedModelPart) identifierPart ); + return new SimpleKeyMapping( keyColumns, basicModelPart ); + } + else { + throw new AssertionFailure( "Unexpected identifier part type" ); } } @@ -271,8 +276,9 @@ public KeyColumn getKeyColumn(int position) { @Override public void forEachKeyColumn(KeyColumnConsumer consumer) { - for ( int i = 0; i < getKeyColumns().size(); i++ ) { - consumer.consume( i, getKeyColumns().get( i ) ); + final var keyColumns = getKeyColumns(); + for ( int i = 0; i < keyColumns.size(); i++ ) { + consumer.consume( i, keyColumns.get( i ) ); } } @@ -288,10 +294,10 @@ public SelectableMapping getSelectable(int columnIndex) { @Override public int forEachSelectable(int offset, SelectableConsumer consumer) { - for ( int i = 0; i < getKeyColumns().size(); i++ ) { - consumer.accept( i, getKeyColumns().get( i ) ); + final var keyColumns = getKeyColumns(); + for ( int i = 0; i < keyColumns.size(); i++ ) { + consumer.accept( i, keyColumns.get( i ) ); } - return getJdbcTypeCount(); } @@ -315,7 +321,7 @@ protected SqlSelection resolveSqlSelection( TableReference tableReference, KeyColumn keyColumn, SqlAstCreationState creationState) { - final SqlExpressionResolver expressionResolver = creationState.getSqlExpressionResolver(); + final var expressionResolver = creationState.getSqlExpressionResolver(); return expressionResolver.resolveSqlSelection( expressionResolver.resolveSqlExpression( tableReference, keyColumn ), keyColumn.getJdbcMapping().getJdbcJavaType(), @@ -346,7 +352,7 @@ public DomainResult createDomainResult( String resultVariable, DomainResultCreationState creationState) { // create SqlSelection based on the underlying JdbcMapping - final SqlSelection sqlSelection = resolveSqlSelection( + final var sqlSelection = resolveSqlSelection( tableReference, keyColumn, creationState.getSqlAstCreationState() diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java index 6f475a8cf060..9f2354a8ac3b 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java @@ -23,12 +23,10 @@ import org.hibernate.generator.Generator; import org.hibernate.generator.OnExecutionGenerator; import org.hibernate.generator.values.GeneratedValues; -import org.hibernate.generator.values.GeneratedValuesMutationDelegate; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.sql.model.MutationOperation; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; import org.hibernate.sql.model.TableMapping; @@ -57,22 +55,18 @@ public class InsertCoordinatorStandard extends AbstractMutationCoordinator imple public InsertCoordinatorStandard(EntityPersister entityPersister, SessionFactoryImplementor factory) { super( entityPersister, factory ); - if ( entityPersister.isIdentifierAssignedByInsert() || entityPersister.hasInsertGeneratedProperties() ) { - // disable batching in case of insert generated identifier or properties - batchKey = null; - } - else { - batchKey = new BasicBatchKey( entityPersister.getEntityName() + "#INSERT" ); - } - - if ( entityPersister.isDynamicInsert() ) { - // the entity specified dynamic-insert - skip generating the - // static inserts as we will create them every time - staticInsertGroup = null; - } - else { - staticInsertGroup = generateStaticOperationGroup(); - } + batchKey = + entityPersister.isIdentifierAssignedByInsert() || entityPersister.hasInsertGeneratedProperties() + // disable batching in case of insert-generated identifier or properties + ? null + : new BasicBatchKey( entityPersister.getEntityName() + "#INSERT" ); + + staticInsertGroup = + entityPersister.isDynamicInsert() + // the entity specified dynamic-insert - skip generating the + // static inserts as we will create them every time + ? null + : generateStaticOperationGroup(); } @Override @@ -117,24 +111,22 @@ public GeneratedValues coordinateInsert( SharedSessionContractImplementor session) { // apply any pre-insert in-memory value generation final boolean needsDynamicInsert = preInsertInMemoryValueGeneration( values, entity, session ); - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); final boolean forceIdentifierBinding = persister.getGenerator().generatedOnExecution() && id != null; - if ( persister.isDynamicInsert() - || needsDynamicInsert || forceIdentifierBinding ) { - return doDynamicInserts( id, values, entity, session, forceIdentifierBinding ); - } - else { - return doStaticInserts( id, values, entity, session ); - } + return persister.isDynamicInsert() + || needsDynamicInsert + || forceIdentifierBinding + ? doDynamicInserts( id, values, entity, session, forceIdentifierBinding ) + : doStaticInserts( id, values, entity, session ); } protected boolean preInsertInMemoryValueGeneration(Object[] values, Object entity, SharedSessionContractImplementor session) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); boolean foundStateDependentGenerator = false; if ( persister.hasPreInsertGeneratedProperties() ) { - final Generator[] generators = persister.getGenerators(); + final var generators = persister.getGenerators(); for ( int i = 0; i < generators.length; i++ ) { - final Generator generator = generators[i]; + final var generator = generators[i]; if ( generator != null && generator.generatesOnInsert() && generator.generatedBeforeExecution( entity, session ) ) { @@ -168,11 +160,11 @@ public boolean hasNonNullBindings(TableMapping tableMapping) { } protected GeneratedValues doStaticInserts(Object id, Object[] values, Object object, SharedSessionContractImplementor session) { - final InsertValuesAnalysis insertValuesAnalysis = new InsertValuesAnalysis( entityPersister(), values ); + final var insertValuesAnalysis = new InsertValuesAnalysis( entityPersister(), values ); - final TableInclusionChecker tableInclusionChecker = getTableInclusionChecker( insertValuesAnalysis ); + final var tableInclusionChecker = getTableInclusionChecker( insertValuesAnalysis ); - final MutationExecutor mutationExecutor = executor( session, staticInsertGroup, false ); + final var mutationExecutor = executor( session, staticInsertGroup, false ); decomposeForInsert( mutationExecutor, @@ -206,19 +198,19 @@ protected void decomposeForInsert( boolean[] propertyInclusions, TableInclusionChecker tableInclusionChecker, SharedSessionContractImplementor session) { - final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); - final AttributeMappingsList attributeMappings = entityPersister().getAttributeMappings(); + final var jdbcValueBindings = mutationExecutor.getJdbcValueBindings(); + final var attributeMappings = entityPersister().getAttributeMappings(); for ( int position = 0; position < mutationGroup.getNumberOfOperations(); position++ ) { - final MutationOperation operation = mutationGroup.getOperation( position ); - final EntityTableMapping tableDetails = (EntityTableMapping) operation.getTableDetails(); + final var operation = mutationGroup.getOperation( position ); + final var tableDetails = (EntityTableMapping) operation.getTableDetails(); if ( tableInclusionChecker.include( tableDetails ) ) { final int[] attributeIndexes = tableDetails.getAttributeIndexes(); for ( int i = 0; i < attributeIndexes.length; i++ ) { final int attributeIndex = attributeIndexes[ i ]; if ( propertyInclusions[attributeIndex] ) { - final AttributeMapping mapping = attributeMappings.get( attributeIndex ); - decomposeAttribute( values[attributeIndex], session, jdbcValueBindings, mapping ); + decomposeAttribute( values[attributeIndex], session, jdbcValueBindings, + attributeMappings.get( attributeIndex ) ); } } } @@ -229,8 +221,8 @@ protected void decomposeForInsert( } else { for ( int position = 0; position < mutationGroup.getNumberOfOperations(); position++ ) { - final MutationOperation jdbcOperation = mutationGroup.getOperation( position ); - final EntityTableMapping tableDetails = (EntityTableMapping) jdbcOperation.getTableDetails(); + final var jdbcOperation = mutationGroup.getOperation( position ); + final var tableDetails = (EntityTableMapping) jdbcOperation.getTableDetails(); breakDownJdbcValue( id, session, jdbcValueBindings, tableDetails ); } } @@ -288,18 +280,13 @@ protected GeneratedValues doDynamicInserts( Object object, SharedSessionContractImplementor session, boolean forceIdentifierBinding) { - final boolean[] insertability = getPropertiesToInsert( values ); - final MutationOperationGroup insertGroup = - generateDynamicInsertSqlGroup( insertability, object, session, forceIdentifierBinding ); - - final MutationExecutor mutationExecutor = executor( session, insertGroup, true ); - - final InsertValuesAnalysis insertValuesAnalysis = new InsertValuesAnalysis( entityPersister(), values ); - - final TableInclusionChecker tableInclusionChecker = getTableInclusionChecker( insertValuesAnalysis ); - - decomposeForInsert( mutationExecutor, id, values, insertGroup, insertability, tableInclusionChecker, session ); - + final boolean[] propertiesToInsert = getPropertiesToInsert( values ); + final var insertGroup = + generateDynamicInsertSqlGroup( propertiesToInsert, object, session, forceIdentifierBinding ); + final var mutationExecutor = executor( session, insertGroup, true ); + final var insertValuesAnalysis = new InsertValuesAnalysis( entityPersister(), values ); + final var tableInclusionChecker = getTableInclusionChecker( insertValuesAnalysis ); + decomposeForInsert( mutationExecutor, id, values, insertGroup, propertiesToInsert, tableInclusionChecker, session ); try { return mutationExecutor.execute( object, @@ -331,7 +318,8 @@ private MutationExecutor executor(SharedSessionContractImplementor session, Muta } protected static TableInclusionChecker getTableInclusionChecker(InsertValuesAnalysis insertValuesAnalysis) { - return tableMapping -> !tableMapping.isOptional() || insertValuesAnalysis.hasNonNullBindings( tableMapping ); + return tableMapping -> !tableMapping.isOptional() + || insertValuesAnalysis.hasNonNullBindings( tableMapping ); } @@ -340,8 +328,8 @@ protected static TableInclusionChecker getTableInclusionChecker(InsertValuesAnal * true when the property is insertable and non-null */ public boolean[] getPropertiesToInsert(Object[] fields) { - boolean[] notNull = new boolean[fields.length]; - boolean[] insertable = entityPersister().getPropertyInsertability(); + final var notNull = new boolean[fields.length]; + final var insertable = entityPersister().getPropertyInsertability(); for ( int i = 0; i < fields.length; i++ ) { notNull[i] = insertable[i] && fields[i] != null; } @@ -353,7 +341,7 @@ protected MutationOperationGroup generateDynamicInsertSqlGroup( Object object, SharedSessionContractImplementor session, boolean forceIdentifierBinding) { - final MutationGroupBuilder insertGroupBuilder = new MutationGroupBuilder( MutationType.INSERT, entityPersister() ); + final var insertGroupBuilder = new MutationGroupBuilder( MutationType.INSERT, entityPersister() ); entityPersister().forEachMutableTable( (tableMapping) -> insertGroupBuilder.addTableDetailsBuilder( createTableInsertBuilder( tableMapping, forceIdentifierBinding ) ) ); @@ -362,22 +350,23 @@ protected MutationOperationGroup generateDynamicInsertSqlGroup( } public MutationOperationGroup generateStaticOperationGroup() { - final MutationGroupBuilder insertGroupBuilder = new MutationGroupBuilder( MutationType.INSERT, entityPersister() ); - entityPersister().forEachMutableTable( + final var persister = entityPersister(); + final var insertGroupBuilder = new MutationGroupBuilder( MutationType.INSERT, persister ); + persister.forEachMutableTable( (tableMapping) -> insertGroupBuilder.addTableDetailsBuilder( createTableInsertBuilder( tableMapping, false ) ) ); - applyTableInsertDetails( insertGroupBuilder, entityPersister().getPropertyInsertability(), null, null, false ); + applyTableInsertDetails( insertGroupBuilder, persister.getPropertyInsertability(), null, null, false ); return createOperationGroup( null, insertGroupBuilder.buildMutationGroup() ); } private TableMutationBuilder createTableInsertBuilder(EntityTableMapping tableMapping, boolean forceIdentifierBinding) { - final GeneratedValuesMutationDelegate delegate = entityPersister().getInsertDelegate(); - if ( tableMapping.isIdentifierTable() && delegate != null && !forceIdentifierBinding ) { - return delegate.createTableMutationBuilder( tableMapping.getInsertExpectation(), factory() ); - } - else { - return new TableInsertBuilderStandard( entityPersister(), tableMapping, factory() ); - } + final var persister = entityPersister(); + final var delegate = persister.getInsertDelegate(); + return tableMapping.isIdentifierTable() + && delegate != null + && !forceIdentifierBinding + ? delegate.createTableMutationBuilder( tableMapping.getInsertExpectation(), factory() ) + : new TableInsertBuilderStandard( persister, tableMapping, factory() ); } private void applyTableInsertDetails( @@ -389,7 +378,7 @@ private void applyTableInsertDetails( final AttributeMappingsList attributeMappings = entityPersister().getAttributeMappings(); insertGroupBuilder.forEachTableMutationBuilder( (builder) -> { - final EntityTableMapping tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); + final var tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); assert !tableMapping.isInverse(); // `attributeIndexes` represents the indexes (relative to `attributeMappings`) of @@ -397,12 +386,12 @@ private void applyTableInsertDetails( final int[] attributeIndexes = tableMapping.getAttributeIndexes(); for ( int i = 0; i < attributeIndexes.length; i++ ) { final int attributeIndex = attributeIndexes[ i ]; - final AttributeMapping attributeMapping = attributeMappings.get( attributeIndex ); + final var attributeMapping = attributeMappings.get( attributeIndex ); if ( attributeInclusions[attributeIndex] ) { attributeMapping.forEachInsertable( insertGroupBuilder ); } else { - final Generator generator = attributeMapping.getGenerator(); + final var generator = attributeMapping.getGenerator(); if ( isValueGenerated( generator ) ) { if ( session != null && generator.generatedBeforeExecution( object, session ) ) { attributeInclusions[attributeIndex] = true; @@ -422,22 +411,23 @@ else if ( isValueGenerationInSql( generator, factory.getJdbcServices().getDialec // add the keys insertGroupBuilder.forEachTableMutationBuilder( (tableMutationBuilder) -> { - final TableInsertBuilder tableInsertBuilder = (TableInsertBuilder) tableMutationBuilder; - final EntityTableMapping tableMapping = (EntityTableMapping) tableInsertBuilder.getMutatingTable().getTableMapping(); + final var tableInsertBuilder = (TableInsertBuilder) tableMutationBuilder; + final var tableMapping = (EntityTableMapping) tableInsertBuilder.getMutatingTable().getTableMapping(); + final var keyMapping = tableMapping.getKeyMapping(); if ( tableMapping.isIdentifierTable() && entityPersister().isIdentifierAssignedByInsert() && !forceIdentifierBinding ) { assert entityPersister().getInsertDelegate() != null; - final OnExecutionGenerator generator = (OnExecutionGenerator) entityPersister().getGenerator(); + final var generator = (OnExecutionGenerator) entityPersister().getGenerator(); if ( generator.referenceColumnsInSql( dialect ) ) { final String[] columnValues = generator.getReferencedColumnValues( dialect ); if ( columnValues != null ) { assert columnValues.length == 1; - assert tableMapping.getKeyMapping().getColumnCount() == 1; - tableInsertBuilder.addKeyColumn( columnValues[0], tableMapping.getKeyMapping().getKeyColumn( 0 ) ); + assert keyMapping.getColumnCount() == 1; + tableInsertBuilder.addKeyColumn( columnValues[0], keyMapping.getKeyColumn( 0 ) ); } } } else { - tableMapping.getKeyMapping().forEachKeyColumn( tableInsertBuilder::addKeyColumn ); + keyMapping.forEachKeyColumn( tableInsertBuilder::addKeyColumn ); } } ); } @@ -450,7 +440,7 @@ private static boolean isValueGenerated(Generator generator) { private static boolean isValueGenerationInSql(Generator generator, Dialect dialect) { assert isValueGenerated( generator ); - return ( (OnExecutionGenerator) generator ).referenceColumnsInSql(dialect); + return ( (OnExecutionGenerator) generator ).referenceColumnsInSql( dialect ); } /** diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/TableSet.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/TableSet.java index 6921143fcae4..4d2de0f42b09 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/TableSet.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/TableSet.java @@ -4,11 +4,12 @@ */ package org.hibernate.persister.entity.mutation; -import java.util.Arrays; import java.util.BitSet; import org.hibernate.sql.model.TableMapping; +import static java.util.Arrays.copyOf; + /** * Represents a Set of TableMapping(s); table mappings are * identified by an ordered unique id: the order in which @@ -74,7 +75,7 @@ private void ensureCapacity(final int position) { checks = new Object[position + increments]; } else if ( checks.length <= position ) { - checks = Arrays.copyOf( checks, position + increments ); + checks = copyOf( checks, position + increments ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorNoOp.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorNoOp.java index 0ffb83e91ecf..f5c0dcf8ed9b 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorNoOp.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorNoOp.java @@ -6,11 +6,12 @@ import org.hibernate.generator.values.GeneratedValues; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.sql.model.internal.MutationOperationGroupFactory; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationType; +import static org.hibernate.sql.model.internal.MutationOperationGroupFactory.noOperations; + /** * @author Steve Ebersole */ @@ -18,7 +19,7 @@ public class UpdateCoordinatorNoOp implements UpdateCoordinator { private final MutationOperationGroup operationGroup; public UpdateCoordinatorNoOp(EntityPersister entityPersister) { - operationGroup = MutationOperationGroupFactory.noOperations( MutationType.UPDATE, entityPersister ); + operationGroup = noOperations( MutationType.UPDATE, entityPersister ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java index 0b82c9cb9b15..f2c9fc3f2117 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java @@ -31,10 +31,7 @@ import org.hibernate.generator.Generator; import org.hibernate.generator.OnExecutionGenerator; import org.hibernate.generator.values.GeneratedValues; -import org.hibernate.generator.values.GeneratedValuesMutationDelegate; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.AttributeMapping; -import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.EntityVersionMapping; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SingularAttributeMapping; @@ -61,6 +58,7 @@ import static org.hibernate.internal.util.collections.ArrayHelper.contains; import static org.hibernate.internal.util.collections.ArrayHelper.join; import static org.hibernate.internal.util.collections.ArrayHelper.trim; +import static org.hibernate.internal.util.collections.CollectionHelper.arrayList; /** * Coordinates the updating of an entity. @@ -80,18 +78,18 @@ public class UpdateCoordinatorStandard extends AbstractMutationCoordinator imple public UpdateCoordinatorStandard(EntityPersister entityPersister, SessionFactoryImplementor factory) { super( entityPersister, factory ); - // NOTE : even given dynamic-update and/or dirty optimistic locking + // NOTE: even given dynamic-update and/or dirty optimistic locking // there are cases where we need the full static updates. - this.staticUpdateGroup = buildStaticUpdateGroup(); - this.versionUpdateGroup = buildVersionUpdateGroup(); + staticUpdateGroup = buildStaticUpdateGroup(); + versionUpdateGroup = buildVersionUpdateGroup(); if ( entityPersister.hasUpdateGeneratedProperties() ) { // disable batching in case of update generated properties - this.batchKey = null; - this.versionUpdateBatchkey = null; + batchKey = null; + versionUpdateBatchkey = null; } else { - this.batchKey = new BasicBatchKey( entityPersister.getEntityName() + "#UPDATE" ); - this.versionUpdateBatchkey = new BasicBatchKey( entityPersister.getEntityName() + "#UPDATE_VERSION" ); + batchKey = new BasicBatchKey( entityPersister.getEntityName() + "#UPDATE" ); + versionUpdateBatchkey = new BasicBatchKey( entityPersister.getEntityName() + "#UPDATE_VERSION" ); } } @@ -164,7 +162,7 @@ public GeneratedValues update( int[] incomingDirtyAttributeIndexes, boolean hasDirtyCollection, SharedSessionContractImplementor session) { - final EntityVersionMapping versionMapping = entityPersister().getVersionMapping(); + final var versionMapping = entityPersister().getVersionMapping(); if ( versionMapping != null ) { final var generatedValuesAccess = handlePotentialImplicitForcedVersionIncrement( @@ -181,7 +179,7 @@ public GeneratedValues update( } } - final EntityEntry entry = session.getPersistenceContextInternal().getEntry( entity ); + final var entry = session.getPersistenceContextInternal().getEntry( entity ); // Ensure that an immutable or non-modifiable entity is not being updated unless it is // in the process of being deleted. @@ -191,7 +189,8 @@ public GeneratedValues update( // apply any pre-update in-memory value generation final int[] preUpdateGeneratedAttributeIndexes = preUpdateInMemoryValueGeneration( entity, values, session ); - final int[] dirtyAttributeIndexes = dirtyAttributeIndexes( incomingDirtyAttributeIndexes, preUpdateGeneratedAttributeIndexes ); + final int[] dirtyAttributeIndexes = + dirtyAttributeIndexes( incomingDirtyAttributeIndexes, preUpdateGeneratedAttributeIndexes ); final boolean[] attributeUpdateability; boolean forceDynamicUpdate; @@ -215,7 +214,7 @@ && hasLazyDirtyFields( entityPersister(), dirtyAttributeIndexes ) ) { forceDynamicUpdate = true; attributeUpdateability = getPropertiesToUpdate( dirtyAttributeIndexes, hasDirtyCollection ); - final boolean[] propertyLaziness = entityPersister().getPropertyLaziness(); + final var propertyLaziness = entityPersister().getPropertyLaziness(); for ( int i = 0; i < propertyLaziness.length; i++ ) { // add also all the non-lazy properties because dynamic update is false if ( !propertyLaziness[i] ) { @@ -280,7 +279,7 @@ protected GeneratedValues performUpdate( final InclusionChecker inclusionChecker = (position, attribute) -> attributeUpdateability[position]; - final UpdateValuesAnalysisImpl valuesAnalysis = analyzeUpdateValues( + final var valuesAnalysis = analyzeUpdateValues( entity, values, oldVersion, @@ -482,13 +481,13 @@ protected GeneratedValues doVersionUpdate( SharedSessionContractImplementor session) { assert versionUpdateGroup != null; - final EntityTableMapping mutatingTableDetails = + final var mutatingTableDetails = (EntityTableMapping) versionUpdateGroup.getSingleOperation().getTableDetails(); - final MutationExecutor mutationExecutor = + final var mutationExecutor = updateVersionExecutor( session, versionUpdateGroup, false, batching ); - final EntityVersionMapping versionMapping = entityPersister().getVersionMapping(); + final var versionMapping = entityPersister().getVersionMapping(); // set the new version mutationExecutor.getJdbcValueBindings().bindValue( @@ -539,12 +538,12 @@ private int[] preUpdateInMemoryValueGeneration( Object object, Object[] newValues, SharedSessionContractImplementor session) { - final EntityPersister entityMetamodel = entityPersister(); - if ( !entityMetamodel.hasPreUpdateGeneratedProperties() ) { + final var persister = entityPersister(); + if ( !persister.hasPreUpdateGeneratedProperties() ) { return EMPTY_INT_ARRAY; } - final Generator[] generators = entityMetamodel.getGenerators(); + final var generators = persister.getGenerators(); if ( generators.length != 0 ) { final int[] fieldsPreUpdateNeeded = new int[generators.length]; int count = 0; @@ -572,28 +571,30 @@ private int[] preUpdateInMemoryValueGeneration( * true when the property is dirty */ protected boolean[] getPropertiesToUpdate(final int[] dirtyProperties, final boolean hasDirtyCollection) { - final boolean[] updateability = entityPersister().getPropertyUpdateability(); + final var persister = entityPersister(); + final var updateability = persister.getPropertyUpdateability(); if ( dirtyProperties == null ) { return updateability; } else { - final boolean[] propsToUpdate = new boolean[entityPersister().getNumberOfAttributeMappings()]; + final var propsToUpdate = new boolean[persister.getNumberOfAttributeMappings()]; for ( int property: dirtyProperties ) { if ( updateability[property] ) { propsToUpdate[property] = true; } } - if ( entityPersister().isVersioned() - && entityPersister().getVersionMapping().getVersionAttribute().isUpdateable() ) { - final int versionAttributeIndex = entityPersister().getVersionMapping() - .getVersionAttribute() - .getStateArrayPosition(); - propsToUpdate[versionAttributeIndex] = propsToUpdate[versionAttributeIndex] - || isVersionIncrementRequired( - dirtyProperties, - hasDirtyCollection, - entityPersister().getPropertyVersionability() - ); + if ( persister.isVersioned() ) { + final var versionAttribute = persister.getVersionMapping().getVersionAttribute(); + if ( versionAttribute.isUpdateable() ) { + final int versionAttributeIndex = versionAttribute.getStateArrayPosition(); + propsToUpdate[versionAttributeIndex] = + propsToUpdate[versionAttributeIndex] + || isVersionIncrementRequired( + dirtyProperties, + hasDirtyCollection, + persister.getPropertyVersionability() + ); + } } return propsToUpdate; } @@ -611,8 +612,8 @@ private UpdateValuesAnalysisImpl analyzeUpdateValues( Object rowId, boolean forceDynamicUpdate, SharedSessionContractImplementor session) { - final EntityPersister persister = entityPersister(); - final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + final var persister = entityPersister(); + final var attributeMappings = persister.getAttributeMappings(); // NOTE: // * `dirtyAttributeIndexes == null` means we had no snapshot and couldn't @@ -620,7 +621,7 @@ private UpdateValuesAnalysisImpl analyzeUpdateValues( // * `oldValues == null` just means we had no snapshot to begin with - we might // have used select-before-update to get the dirtyAttributeIndexes (again, // never the case for #merge) - final UpdateValuesAnalysisImpl analysis = new UpdateValuesAnalysisImpl( + final var analysis = new UpdateValuesAnalysisImpl( values, oldValues, dirtyAttributeIndexes, @@ -629,10 +630,10 @@ private UpdateValuesAnalysisImpl analyzeUpdateValues( forceDynamicUpdate ); - final boolean[] propertyUpdateability = persister.getPropertyUpdateability(); + final var propertyUpdateability = persister.getPropertyUpdateability(); for ( int attributeIndex = 0; attributeIndex < attributeMappings.size(); attributeIndex++ ) { - final AttributeMapping attributeMapping = attributeMappings.get( attributeIndex ); + final var attributeMapping = attributeMappings.get( attributeIndex ); analysis.startingAttribute( attributeMapping ); try { @@ -677,7 +678,7 @@ private void processAttribute( InclusionChecker lockingChecker, SharedSessionContractImplementor session) { - final Generator generator = attributeMapping.getGenerator(); + final var generator = attributeMapping.getGenerator(); final boolean generated = isValueGenerated( generator ); final boolean needsDynamicUpdate = generated && session != null && generator.generatedBeforeExecution( entity, session ); @@ -694,8 +695,8 @@ private void processAttribute( } if ( lockingChecker.include( attributeIndex, attributeMapping ) ) { - final Object attributeLockValue = attributeLockValue( attributeIndex, attributeMapping, oldVersion, oldValues ); - processLock( analysis, attributeMapping, session, attributeLockValue ); + processLock( analysis, attributeMapping, session, + attributeLockValue( attributeIndex, attributeMapping, oldVersion, oldValues ) ); } } @@ -704,8 +705,9 @@ private Object attributeLockValue( SingularAttributeMapping attributeMapping, Object oldVersion, Object[] oldValues) { - if ( entityPersister().getVersionMapping() != null - && entityPersister().getVersionMapping().getVersionAttribute() == attributeMapping ) { + final var versionMapping = entityPersister().getVersionMapping(); + if ( versionMapping != null + && versionMapping.getVersionAttribute() == attributeMapping ) { return oldVersion; } else { @@ -715,7 +717,7 @@ && entityPersister().getVersionMapping().getVersionAttribute() == attributeMappi private void processSet(UpdateValuesAnalysisImpl analysis, SelectableMapping selectable, boolean needsDynamicUpdate) { if ( selectable != null && !selectable.isFormula() && selectable.isUpdateable() ) { - final EntityTableMapping tableMapping = physicalTableMappingForMutation( entityPersister(), selectable ); + final var tableMapping = physicalTableMappingForMutation( entityPersister(), selectable ); analysis.registerColumnSet( tableMapping, selectable.getSelectionExpression(), selectable.getWriteExpression() ); if ( needsDynamicUpdate ) { analysis.getTablesNeedingDynamicUpdate().add( tableMapping ); @@ -735,8 +737,11 @@ private void processLock( null, (valueIndex, updateAnalysis, noop, jdbcValue, columnMapping) -> { if ( !columnMapping.isFormula() ) { - final EntityTableMapping tableMapping = physicalTableMappingForMutation( entityPersister(), columnMapping ); - updateAnalysis.registerColumnOptLock( tableMapping, columnMapping.getSelectionExpression(), jdbcValue ); + updateAnalysis.registerColumnOptLock( + physicalTableMappingForMutation( entityPersister(), columnMapping ), + columnMapping.getSelectionExpression(), + jdbcValue + ); } }, session @@ -752,7 +757,7 @@ protected GeneratedValues doStaticUpdate( UpdateValuesAnalysisImpl valuesAnalysis, SharedSessionContractImplementor session) { - final MutationExecutor mutationExecutor = executor( session, staticUpdateGroup, false ); + final var mutationExecutor = executor( session, staticUpdateGroup, false ); decomposeForUpdate( id, @@ -796,8 +801,8 @@ protected void decomposeForUpdate( // apply values for ( int position = 0; position < jdbcOperationGroup.getNumberOfOperations(); position++ ) { - final MutationOperation operation = jdbcOperationGroup.getOperation( position ); - final EntityTableMapping tableMapping = (EntityTableMapping) operation.getTableDetails(); + final var operation = jdbcOperationGroup.getOperation( position ); + final var tableMapping = (EntityTableMapping) operation.getTableDetails(); if ( valuesAnalysis.tablesNeedingUpdate.contains( tableMapping ) ) { final int[] attributeIndexes = tableMapping.getAttributeIndexes(); for ( int i = 0; i < attributeIndexes.length; i++ ) { @@ -816,8 +821,8 @@ protected void decomposeForUpdate( // apply keys for ( int position = 0; position < jdbcOperationGroup.getNumberOfOperations(); position++ ) { - final MutationOperation operation = jdbcOperationGroup.getOperation( position ); - final EntityTableMapping tableMapping = (EntityTableMapping) operation.getTableDetails(); + final var operation = jdbcOperationGroup.getOperation( position ); + final var tableMapping = (EntityTableMapping) operation.getTableDetails(); breakDownKeyJdbcValues( id, rowId, session, jdbcValueBindings, tableMapping ); } } @@ -830,16 +835,16 @@ private void decomposeAttributeForUpdate( JdbcValueBindings jdbcValueBindings, EntityTableMapping tableMapping, int attributeIndex) { - final AttributeMapping attributeMapping = entityPersister().getAttributeMappings().get( attributeIndex ); + final var attributeMapping = entityPersister().getAttributeMappings().get( attributeIndex ); if ( attributeMapping instanceof SingularAttributeMapping ) { - final AttributeAnalysis attributeAnalysisRef = valuesAnalysis.attributeAnalyses.get( attributeIndex ); + final var attributeAnalysisRef = valuesAnalysis.attributeAnalyses.get( attributeIndex ); if ( !attributeAnalysisRef.isSkipped() ) { - final IncludedAttributeAnalysis attributeAnalysis = (IncludedAttributeAnalysis) attributeAnalysisRef; + final var attributeAnalysis = (IncludedAttributeAnalysis) attributeAnalysisRef; if ( attributeAnalysis.includeInSet() ) { // apply the new values if ( includeInSet( dirtinessChecker, attributeIndex, attributeMapping, attributeAnalysis ) ) { - decomposeAttributeMapping(session, jdbcValueBindings, tableMapping, attributeMapping, values[attributeIndex] ); + decomposeAttributeMapping( session, jdbcValueBindings, tableMapping, attributeMapping, values[attributeIndex] ); } } @@ -925,7 +930,7 @@ protected GeneratedValues doDynamicUpdate( UpdateValuesAnalysisImpl valuesAnalysis, SharedSessionContractImplementor session) { // Create the JDBC operation descriptors - final MutationOperationGroup dynamicUpdateGroup = generateDynamicUpdateGroup( + final var dynamicUpdateGroup = generateDynamicUpdateGroup( entity, id, rowId, @@ -936,7 +941,7 @@ protected GeneratedValues doDynamicUpdate( // and then execute them - final MutationExecutor mutationExecutor = executor( session, dynamicUpdateGroup, true ); + final var mutationExecutor = executor( session, dynamicUpdateGroup, true ); decomposeForUpdate( id, @@ -990,10 +995,9 @@ private MutationExecutor updateVersionExecutor( MutationOperationGroup group, boolean dynamicUpdate, boolean batching) { - if ( batching ) { - return updateVersionExecutor( session, group, dynamicUpdate ); - } - return mutationExecutorService.createExecutor( NoBatchKeyAccess.INSTANCE, group, session ); + return batching + ? updateVersionExecutor( session, group, dynamicUpdate ) + : mutationExecutorService.createExecutor( NoBatchKeyAccess.INSTANCE, group, session ); } @@ -1036,10 +1040,10 @@ protected MutationOperationGroup generateDynamicUpdateGroup( Object[] oldValues, UpdateValuesAnalysisImpl valuesAnalysis, SharedSessionContractImplementor session) { - final MutationGroupBuilder updateGroupBuilder = new MutationGroupBuilder( MutationType.UPDATE, entityPersister() ); + final var updateGroupBuilder = new MutationGroupBuilder( MutationType.UPDATE, entityPersister() ); entityPersister().forEachMutableTable( (tableMapping) -> { - final MutatingTableReference tableReference = new MutatingTableReference( tableMapping ); + final var tableReference = new MutatingTableReference( tableMapping ); final TableMutationBuilder tableUpdateBuilder; if ( ! valuesAnalysis.tablesNeedingUpdate.contains( tableReference.getTableMapping() ) ) { // this table does not need updating @@ -1065,7 +1069,7 @@ protected MutationOperationGroup generateDynamicUpdateGroup( } private TableMutationBuilder createTableUpdateBuilder(EntityTableMapping tableMapping) { - final GeneratedValuesMutationDelegate delegate = + final var delegate = tableMapping.isIdentifierTable() ? entityPersister().getUpdateDelegate() : null; @@ -1086,20 +1090,21 @@ private void applyTableUpdateDetails( UpdateValuesAnalysisImpl updateValuesAnalysis, DirtinessChecker dirtinessChecker, SharedSessionContractImplementor session) { - final EntityVersionMapping versionMapping = entityPersister().getVersionMapping(); - final AttributeMappingsList attributeMappings = entityPersister().getAttributeMappings(); - final boolean[] versionability = entityPersister().getPropertyVersionability(); - final OptimisticLockStyle optimisticLockStyle = entityPersister().optimisticLockStyle(); + final var persister = entityPersister(); + final var versionMapping = persister.getVersionMapping(); + final var attributeMappings = persister.getAttributeMappings(); + final boolean[] versionability = persister.getPropertyVersionability(); + final var optimisticLockStyle = persister.optimisticLockStyle(); updateGroupBuilder.forEachTableMutationBuilder( (builder) -> { - final EntityTableMapping tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); + final var tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); final int[] attributeIndexes = tableMapping.getAttributeIndexes(); for ( int i = 0; i < attributeIndexes.length; i++ ) { final int attributeIndex = attributeIndexes[i]; - final AttributeMapping attributeMapping = attributeMappings.get( attributeIndex ); - final AttributeAnalysis attributeAnalysis = updateValuesAnalysis.attributeAnalyses.get( attributeIndex ); + final var attributeMapping = attributeMappings.get( attributeIndex ); + final var attributeAnalysis = updateValuesAnalysis.attributeAnalyses.get( attributeIndex ); if ( attributeAnalysis.includeInSet() ) { assert updateValuesAnalysis.tablesNeedingUpdate.contains( tableMapping ) @@ -1142,22 +1147,22 @@ private void applyTableUpdateDetails( } ); updateGroupBuilder.forEachTableMutationBuilder( (builder) -> { - final EntityTableMapping tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); - final TableUpdateBuilder tableUpdateBuilder = (TableUpdateBuilder) builder; - applyKeyRestriction( rowId, entityPersister(), tableUpdateBuilder, tableMapping ); + final var tableMapping = (EntityTableMapping) builder.getMutatingTable().getTableMapping(); + final var tableUpdateBuilder = (TableUpdateBuilder) builder; + applyKeyRestriction( rowId, persister, tableUpdateBuilder, tableMapping ); applyPartitionKeyRestriction( tableUpdateBuilder ); } ); } private void applyPartitionKeyRestriction(TableUpdateBuilder tableUpdateBuilder) { - final EntityPersister persister = entityPersister(); + final var persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + final var attributeMappings = persister.getAttributeMappings(); for ( int m = 0; m < attributeMappings.size(); m++ ) { - final AttributeMapping attributeMapping = attributeMappings.get( m ); + final var attributeMapping = attributeMappings.get( m ); final int jdbcTypeCount = attributeMapping.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { - final SelectableMapping selectableMapping = attributeMapping.getSelectable( i ); + final var selectableMapping = attributeMapping.getSelectable( i ); if ( selectableMapping.isPartitioned() ) { tableUpdateBuilder.addKeyRestrictionLeniently( selectableMapping ); } @@ -1230,7 +1235,7 @@ private void applyAttributeUpdateDetails( AttributeMapping attributeMapping, TableUpdateBuilder tableUpdateBuilder, SharedSessionContractImplementor session) { - final Generator generator = attributeMapping.getGenerator(); + final var generator = attributeMapping.getGenerator(); if ( needsValueGeneration( entity, session, generator ) ) { handleValueGeneration( attributeMapping, updateGroupBuilder, (OnExecutionGenerator) generator ); } @@ -1403,11 +1408,11 @@ public void finishedAttribute(AttributeMapping attribute) { * Callback to register the setting of a column value */ public void registerColumnSet(EntityTableMapping table, String readExpression, String writeExpression) { - final IncludedAttributeAnalysis includedAttributeAnalysis = (IncludedAttributeAnalysis) currentAttributeAnalysis; + final var includedAttributeAnalysis = (IncludedAttributeAnalysis) currentAttributeAnalysis; includedAttributeAnalysis.columnValueAnalyses.add( new ColumnSetAnalysis( readExpression, writeExpression ) ); if ( !dirtyChecked ) { - final SingularAttributeMapping attribute = includedAttributeAnalysis.attribute; + final var attribute = includedAttributeAnalysis.attribute; if ( dirtinessChecker.include( attribute.getStateArrayPosition(), attribute ) ) { tablesNeedingUpdate.add( table ); } @@ -1425,7 +1430,7 @@ public void registerColumnSet(EntityTableMapping table, String readExpression, S } public void registerColumnOptLock(EntityTableMapping table, String readExpression, Object lockValue) { - final IncludedAttributeAnalysis attributeAnalysis = (IncludedAttributeAnalysis) currentAttributeAnalysis; + final var attributeAnalysis = (IncludedAttributeAnalysis) currentAttributeAnalysis; attributeAnalysis.columnLockingAnalyses.add( new ColumnLockingAnalysis( readExpression, lockValue ) ); if ( dirtyAttributeIndexes != null && lockValue == null ) { @@ -1435,7 +1440,7 @@ public void registerColumnOptLock(EntityTableMapping table, String readExpressio } public void registerValueGeneratedInSqlNoWrite() { - final IncludedAttributeAnalysis attributeAnalysis = (IncludedAttributeAnalysis) currentAttributeAnalysis; + final var attributeAnalysis = (IncludedAttributeAnalysis) currentAttributeAnalysis; attributeAnalysis.setValueGeneratedInSqlNoWrite( true ); } } @@ -1515,8 +1520,8 @@ private static class IncludedAttributeAnalysis implements AttributeAnalysisImple public IncludedAttributeAnalysis(SingularAttributeMapping attribute) { this.attribute = attribute; - this.columnValueAnalyses = CollectionHelper.arrayList( attribute.getJdbcTypeCount() ); - this.columnLockingAnalyses = CollectionHelper.arrayList( attribute.getJdbcTypeCount() ); + this.columnValueAnalyses = arrayList( attribute.getJdbcTypeCount() ); + this.columnLockingAnalyses = arrayList( attribute.getJdbcTypeCount() ); } @Override @@ -1610,7 +1615,8 @@ public Object getLockValue() { } private MutationOperationGroup buildStaticUpdateGroup() { - final UpdateValuesAnalysisImpl valuesAnalysis = analyzeUpdateValues( + final var persister = entityPersister(); + final var valuesAnalysis = analyzeUpdateValues( null, null, null, @@ -1619,12 +1625,12 @@ private MutationOperationGroup buildStaticUpdateGroup() { (index,attribute) -> isValueGenerated( attribute.getGenerator() ) && isValueGenerationInSql( attribute.getGenerator(), dialect() ) - || entityPersister().getPropertyUpdateability()[index], + || persister.getPropertyUpdateability()[index], (index,attribute) -> - switch ( entityPersister().optimisticLockStyle() ) { + switch ( persister.optimisticLockStyle() ) { case ALL -> true; case VERSION -> { - final EntityVersionMapping versionMapping = entityPersister().getVersionMapping(); + final var versionMapping = persister.getVersionMapping(); yield versionMapping != null && attribute == versionMapping.getVersionAttribute(); } default -> false; @@ -1635,10 +1641,10 @@ && isValueGenerationInSql( attribute.getGenerator(), dialect() ) null ); - final MutationGroupBuilder updateGroupBuilder = new MutationGroupBuilder( MutationType.UPDATE, entityPersister() ); + final var updateGroupBuilder = new MutationGroupBuilder( MutationType.UPDATE, persister ); - entityPersister().forEachMutableTable( (tableMapping) -> { - // NOTE : TableUpdateBuilderStandard handles custom sql-update mappings + persister.forEachMutableTable( (tableMapping) -> { + // NOTE: TableUpdateBuilderStandard handles custom SQL update mappings updateGroupBuilder.addTableDetailsBuilder( createTableUpdateBuilder( tableMapping ) ); } ); @@ -1662,12 +1668,12 @@ && isValueGenerationInSql( attribute.getGenerator(), dialect() ) } private MutationOperationGroup buildVersionUpdateGroup() { - final EntityVersionMapping versionMapping = entityPersister().getVersionMapping(); + final var versionMapping = entityPersister().getVersionMapping(); if ( versionMapping == null ) { return null; } else { - final EntityTableMapping identifierTableMapping = entityPersister().getIdentifierTableMapping(); + final var identifierTableMapping = entityPersister().getIdentifierTableMapping(); final AbstractTableUpdateBuilder updateBuilder = newTableUpdateBuilder( identifierTableMapping ); @@ -1681,7 +1687,7 @@ private MutationOperationGroup buildVersionUpdateGroup() { applyPartitionKeyRestriction( updateBuilder ); //noinspection resource - final JdbcMutationOperation jdbcMutation = factory() + final var jdbcMutation = factory() .getJdbcServices() .getJdbcEnvironment() .getSqlAstTranslatorFactory() @@ -1703,7 +1709,7 @@ protected interface DirtinessChecker { } public boolean hasLazyDirtyFields(EntityPersister persister, int[] dirtyFields) { - final boolean[] propertyLaziness = persister.getPropertyLaziness(); + final var propertyLaziness = persister.getPropertyLaziness(); for ( int i = 0; i < dirtyFields.length; i++ ) { if ( propertyLaziness[dirtyFields[i]] ) { return true; @@ -1715,7 +1721,7 @@ public boolean hasLazyDirtyFields(EntityPersister persister, int[] dirtyFields) public EntityTableMapping physicalTableMappingForMutation( EntityPersister persister, SelectableMapping selectableMapping) { final String tableNameForMutation = persister.physicalTableNameForMutation( selectableMapping ); - final EntityTableMapping[] tableMappings = persister.getTableMappings(); + final var tableMappings = persister.getTableMappings(); for ( int i = 0; i < tableMappings.length; i++ ) { if ( tableNameForMutation.equals( tableMappings[i].getTableName() ) ) { return tableMappings[i];