From 033eeb724112bf164a31e773c9f9fc6fe659b8f6 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Tue, 24 Jan 2023 17:56:05 +0100 Subject: [PATCH] Make session part of JdbcValueBindings --- .../engine/jdbc/batch/internal/BatchImpl.java | 4 +- .../jdbc/mutation/JdbcValueBindings.java | 20 ++------ .../internal/AbstractMutationExecutor.java | 4 +- .../AbstractSingleMutationExecutor.java | 8 +++- .../internal/JdbcValueBindingsImpl.java | 16 +++---- .../internal/MutationExecutorPostInsert.java | 20 ++++---- ...MutationExecutorPostInsertSingleTable.java | 3 +- .../MutationExecutorSingleBatched.java | 2 +- .../MutationExecutorSingleNonBatched.java | 2 +- .../MutationExecutorSingleSelfExecuting.java | 7 ++- .../internal/MutationExecutorStandard.java | 3 +- .../StandardMutationExecutorService.java | 2 +- .../id/insert/AbstractReturningDelegate.java | 2 +- .../id/insert/AbstractSelectingDelegate.java | 2 +- .../id/insert/GetGeneratedKeysDelegate.java | 2 +- .../metamodel/mapping/ModelPart.java | 1 + .../collection/OneToManyPersister.java | 6 +-- .../DeleteRowsCoordinatorStandard.java | 6 +-- .../InsertRowsCoordinatorStandard.java | 21 ++++----- .../mutation/RemoveCoordinatorStandard.java | 14 +++--- .../UpdateRowsCoordinatorOneToMany.java | 6 +-- .../UpdateRowsCoordinatorStandard.java | 6 +-- .../mutation/AbstractMutationCoordinator.java | 4 +- .../entity/mutation/DeleteCoordinator.java | 35 +++++++------- .../entity/mutation/InsertCoordinator.java | 18 +++---- .../mutation/UpdateCoordinatorStandard.java | 47 +++++++++---------- .../jdbc/OptionalTableUpdateOperation.java | 5 +- .../orm/test/jdbc/internal/BatchingTest.java | 23 ++++----- 28 files changed, 135 insertions(+), 154 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java index 9261f8093b..100042d2e7 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/BatchImpl.java @@ -126,7 +126,7 @@ public void addToBatch(JdbcValueBindings jdbcValueBindings, TableInclusionChecke //noinspection resource final PreparedStatement statement = statementDetails.resolveStatement(); sqlStatementLogger.logStatement( statementDetails.getSqlString() ); - jdbcValueBindings.beforeStatement( statementDetails, session ); + jdbcValueBindings.beforeStatement( statementDetails ); try { statement.addBatch(); @@ -140,7 +140,7 @@ public void addToBatch(JdbcValueBindings jdbcValueBindings, TableInclusionChecke ); } finally { - jdbcValueBindings.afterStatement( statementDetails.getMutatingTableDetails(), session ); + jdbcValueBindings.afterStatement( statementDetails.getMutatingTableDetails() ); } } ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/JdbcValueBindings.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/JdbcValueBindings.java index fcb1d784e4..93bea00791 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/JdbcValueBindings.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/JdbcValueBindings.java @@ -9,7 +9,6 @@ import org.hibernate.Incubating; import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails; import org.hibernate.engine.jdbc.mutation.spi.BindingGroup; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.sql.model.TableMapping; @@ -28,31 +27,22 @@ public interface JdbcValueBindings { /** * Binds a value for a specific column+usage */ - void bindValue( - Object value, - String tableName, - String columnName, - ParameterUsage usage, - SharedSessionContractImplementor session); + void bindValue(Object value, String tableName, String columnName, ParameterUsage usage); /** * Binds a value for a specific column+usage */ - default void bindValue( - Object value, - SelectableMapping selectableMapping, - ParameterUsage usage, - SharedSessionContractImplementor session) { - bindValue( value, selectableMapping.getContainingTableExpression(), selectableMapping.getSelectionExpression(), usage, session ); + default void bindValue(Object value, SelectableMapping selectableMapping, ParameterUsage usage) { + bindValue( value, selectableMapping.getContainingTableExpression(), selectableMapping.getSelectionExpression(), usage ); } /** * Called before the execution of the operation for the specified table */ - void beforeStatement(PreparedStatementDetails statementDetails, SharedSessionContractImplementor session); + void beforeStatement(PreparedStatementDetails statementDetails); /** * Called after the execution of the operation for the specified table */ - void afterStatement(TableMapping mutatingTable, SharedSessionContractImplementor session); + void afterStatement(TableMapping mutatingTable); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractMutationExecutor.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractMutationExecutor.java index bd53807b2f..48c58beac5 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractMutationExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractMutationExecutor.java @@ -90,7 +90,7 @@ protected void performNonBatchedMutation( // If we get here the statement is needed - make sure it is resolved session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() ); - valueBindings.beforeStatement( statementDetails, session ); + valueBindings.beforeStatement( statementDetails ); try { final int affectedRowCount = session.getJdbcCoordinator() @@ -118,7 +118,7 @@ protected void performNonBatchedMutation( if ( statementDetails.getStatement() != null ) { statementDetails.releaseStatement( session ); } - valueBindings.afterStatement( tableDetails, session ); + valueBindings.afterStatement( tableDetails ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractSingleMutationExecutor.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractSingleMutationExecutor.java index 98e71d0331..96e5cf4a06 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractSingleMutationExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/AbstractSingleMutationExecutor.java @@ -11,6 +11,7 @@ import org.hibernate.engine.jdbc.mutation.JdbcValueBindings; import org.hibernate.engine.jdbc.mutation.ParameterUsage; import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.sql.model.PreparableMutationOperation; import org.hibernate.sql.model.jdbc.JdbcValueDescriptor; @@ -21,12 +22,15 @@ public abstract class AbstractSingleMutationExecutor extends AbstractMutationExe private final PreparableMutationOperation mutationOperation; private final JdbcValueBindingsImpl valueBindings; - public AbstractSingleMutationExecutor(PreparableMutationOperation mutationOperation) { + public AbstractSingleMutationExecutor( + PreparableMutationOperation mutationOperation, + SharedSessionContractImplementor session) { this.mutationOperation = mutationOperation; this.valueBindings = new JdbcValueBindingsImpl( mutationOperation.getMutationType(), mutationOperation.getMutationTarget(), - this::findJdbcValueDescriptor + this::findJdbcValueDescriptor, + session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/JdbcValueBindingsImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/JdbcValueBindingsImpl.java index b0456665f7..04e87f1770 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/JdbcValueBindingsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/JdbcValueBindingsImpl.java @@ -29,16 +29,19 @@ public class JdbcValueBindingsImpl implements JdbcValueBindings { private final MutationType mutationType; private final MutationTarget mutationTarget; private final JdbcValueDescriptorAccess jdbcValueDescriptorAccess; + private final SharedSessionContractImplementor session; private final Map bindingGroupMap = new HashMap<>(); public JdbcValueBindingsImpl( MutationType mutationType, MutationTarget mutationTarget, - JdbcValueDescriptorAccess jdbcValueDescriptorAccess) { + JdbcValueDescriptorAccess jdbcValueDescriptorAccess, + SharedSessionContractImplementor session) { this.mutationType = mutationType; this.mutationTarget = mutationTarget; this.jdbcValueDescriptorAccess = jdbcValueDescriptorAccess; + this.session = session; } @Override @@ -51,8 +54,7 @@ public void bindValue( Object value, String tableName, String columnName, - ParameterUsage usage, - SharedSessionContractImplementor session) { + ParameterUsage usage) { final JdbcValueDescriptor jdbcValueDescriptor = jdbcValueDescriptorAccess.resolveValueDescriptor( tableName, columnName, usage ); if ( jdbcValueDescriptor == null ) { throw new UnknownParameterException( mutationType, mutationTarget, tableName, columnName, usage ); @@ -74,9 +76,7 @@ private BindingGroup resolveBindingGroup(String tableName) { } @Override - public void beforeStatement( - PreparedStatementDetails statementDetails, - SharedSessionContractImplementor session) { + public void beforeStatement(PreparedStatementDetails statementDetails) { final BindingGroup bindingGroup = bindingGroupMap.get( statementDetails.getMutatingTableDetails().getTableName() ); if ( bindingGroup == null ) { statementDetails.resolveStatement(); @@ -107,9 +107,7 @@ public void beforeStatement( } @Override - public void afterStatement( - TableMapping mutatingTable, - SharedSessionContractImplementor session) { + public void afterStatement(TableMapping mutatingTable) { final BindingGroup bindingGroup = bindingGroupMap.remove( mutatingTable.getTableName() ); if ( bindingGroup == null ) { return; diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsert.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsert.java index fde818d4c0..d2978215a8 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsert.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsert.java @@ -66,7 +66,8 @@ public MutationExecutorPostInsert(MutationOperationGroup mutationOperationGroup, this.valueBindings = new JdbcValueBindingsImpl( MutationType.INSERT, mutationTarget, - this::findJdbcValueDescriptor + this::findJdbcValueDescriptor, + session ); this.mutationOperationGroup = mutationOperationGroup; @@ -191,18 +192,19 @@ private void executeWithId( tableDetails.getKeyMapping().breakDownKeyJdbcValues( id, - (jdbcValue, columnMapping) -> valueBindings.bindValue( - jdbcValue, - tableName, - columnMapping.getColumnName(), - ParameterUsage.SET, - session - ), + (jdbcValue, columnMapping) -> { + valueBindings.bindValue( + jdbcValue, + tableName, + columnMapping.getColumnName(), + ParameterUsage.SET + ); + }, session ); session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() ); - valueBindings.beforeStatement( statementDetails, session ); + valueBindings.beforeStatement( statementDetails ); try { final int affectedRowCount = session.getJdbcCoordinator() diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsertSingleTable.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsertSingleTable.java index 6ea35307bb..859a379348 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsertSingleTable.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsertSingleTable.java @@ -66,7 +66,8 @@ public MutationExecutorPostInsertSingleTable( (tableName, columnName, usage) -> { assert identityInsertStatementDetails.getMutatingTableDetails().getTableName().equals( tableName ); return operation.findValueDescriptor( columnName, usage ); - } + }, + session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleBatched.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleBatched.java index fccc55de94..eff7daf09b 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleBatched.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleBatched.java @@ -27,7 +27,7 @@ public MutationExecutorSingleBatched( BatchKey batchKey, int batchSize, SharedSessionContractImplementor session) { - super( mutationOperation ); + super( mutationOperation, session ); this.batchSize = batchSize; this.session = session; diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleNonBatched.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleNonBatched.java index fee4390c89..b302fdc96f 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleNonBatched.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleNonBatched.java @@ -21,7 +21,7 @@ public class MutationExecutorSingleNonBatched extends AbstractSingleMutationExec public MutationExecutorSingleNonBatched( PreparableMutationOperation mutationOperation, SharedSessionContractImplementor session) { - super( mutationOperation ); + super( mutationOperation, session ); this.statementGroup = new PreparedStatementGroupSingleTable( mutationOperation, session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleSelfExecuting.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleSelfExecuting.java index 69a39bf243..f1f5adcfa7 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleSelfExecuting.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorSingleSelfExecuting.java @@ -22,13 +22,16 @@ public class MutationExecutorSingleSelfExecuting extends AbstractMutationExecuto private final SelfExecutingUpdateOperation operation; private final JdbcValueBindingsImpl valueBindings; - public MutationExecutorSingleSelfExecuting(SelfExecutingUpdateOperation operation) { + public MutationExecutorSingleSelfExecuting( + SelfExecutingUpdateOperation operation, + SharedSessionContractImplementor session) { this.operation = operation; this.valueBindings = new JdbcValueBindingsImpl( operation.getMutationType(), operation.getMutationTarget(), - this::findJdbcValueDescriptor + this::findJdbcValueDescriptor, + session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorStandard.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorStandard.java index bbfe8f217d..2e1999ba33 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorStandard.java @@ -152,7 +152,8 @@ public MutationExecutorStandard( this.valueBindings = new JdbcValueBindingsImpl( mutationOperationGroup.getMutationType(), mutationOperationGroup.getMutationTarget(), - this::findJdbcValueDescriptor + this::findJdbcValueDescriptor, + session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/StandardMutationExecutorService.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/StandardMutationExecutorService.java index 6434472d9f..4dcbedfcb4 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/StandardMutationExecutorService.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/StandardMutationExecutorService.java @@ -74,7 +74,7 @@ public MutationExecutor createExecutor( if ( numberOfOperations == 1 ) { final MutationOperation singleOperation = operationGroup.getSingleOperation(); if ( singleOperation instanceof SelfExecutingUpdateOperation ) { - return new MutationExecutorSingleSelfExecuting( (SelfExecutingUpdateOperation) singleOperation ); + return new MutationExecutorSingleSelfExecuting( (SelfExecutingUpdateOperation) singleOperation, session ); } final PreparableMutationOperation jdbcOperation = (PreparableMutationOperation) singleOperation; diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java index ab636e20fa..c822e08055 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractReturningDelegate.java @@ -38,7 +38,7 @@ public Object performInsert( Object entity, SharedSessionContractImplementor session) { session.getJdbcServices().getSqlStatementLogger().logStatement( insertStatementDetails.getSqlString() ); - valueBindings.beforeStatement( insertStatementDetails, session ); + valueBindings.beforeStatement( insertStatementDetails ); return executeAndExtract( insertStatementDetails.getSqlString(), insertStatementDetails.getStatement(), session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java index 4a520161aa..62e70bc2ef 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/AbstractSelectingDelegate.java @@ -70,7 +70,7 @@ public Object performInsert( final JdbcServices jdbcServices = session.getJdbcServices(); jdbcServices.getSqlStatementLogger().logStatement( insertStatementDetails.getSqlString() ); - jdbcValueBindings.beforeStatement( insertStatementDetails, session ); + jdbcValueBindings.beforeStatement( insertStatementDetails ); jdbcCoordinator.getResultSetReturn() .executeUpdate( insertStatementDetails.resolveStatement(), insertStatementDetails.getSqlString() ); diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java index 97246daa23..114d779717 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java @@ -101,7 +101,7 @@ public Object performInsert( jdbcServices.getSqlStatementLogger().logStatement( insertSql ); final PreparedStatement insertStatement = insertStatementDetails.resolveStatement(); - jdbcValueBindings.beforeStatement( insertStatementDetails, session ); + jdbcValueBindings.beforeStatement( insertStatementDetails ); try { jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatement, insertSql ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ModelPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ModelPart.java index 5f4504557f..136386a9c1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ModelPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ModelPart.java @@ -138,6 +138,7 @@ default AttributeMapping asAttributeMapping() { @FunctionalInterface interface JdbcValueConsumer { void consume(Object value, SelectableMapping jdbcValueMapping); + } void breakDownJdbcValues(Object domainValue, JdbcValueConsumer valueConsumer, SharedSessionContractImplementor session); 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 874ab654c4..ef0a757af1 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 @@ -245,8 +245,7 @@ private void writeIndex( (jdbcValue, jdbcValueMapping, usage) -> jdbcValueBindings.bindValue( jdbcValue, jdbcValueMapping, - usage, - session + usage ) ); @@ -259,8 +258,7 @@ private void writeIndex( (jdbcValue, jdbcValueMapping) -> jdbcValueBindings.bindValue( jdbcValue, jdbcValueMapping, - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ) ); 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 e3e3935096..b8cfb69052 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 @@ -106,10 +106,8 @@ public void deleteRows(PersistentCollection collection, Object key, SharedSes } jdbcValueBindings.bindValue( jdbcValue, - mutationTarget.getIdentifierTableName(), - jdbcValueMapping.getSelectionExpression(), - ParameterUsage.RESTRICT, - session + jdbcValueMapping, + ParameterUsage.RESTRICT ); } ); 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 053b9c4495..63d287ea13 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 @@ -106,19 +106,14 @@ public void insertRows( if ( entryChecker == null || entryChecker.include( entry, entryCount, collection, pluralAttribute ) ) { // if the entry is included, perform the "insert" - insertRowValues.applyValues( collection, id, entry, entryCount, session, (value, jdbcValueMapping, usage) -> { -// if ( !jdbcValueMapping.isInsertable() ) { -// return; -// } - jdbcValueBindings.bindValue( - value, - jdbcValueMapping.getContainingTableExpression(), - jdbcValueMapping.getSelectionExpression(), - usage, - session - ); - } ); - + insertRowValues.applyValues( + collection, + id, + entry, + entryCount, + session, + jdbcValueBindings::bindValue + ); mutationExecutor.execute( entry, null, null, null, session ); } 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 3b9aba8266..5ba26efa22 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 @@ -100,13 +100,13 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session) final ForeignKeyDescriptor fkDescriptor = mutationTarget.getTargetPart().getKeyDescriptor(); fkDescriptor.getKeyPart().decompose( key, - (jdbcValue, jdbcValueMapping) -> jdbcValueBindings.bindValue( - jdbcValue, - mutationTarget.getIdentifierTableMapping().getTableName(), - jdbcValueMapping.getSelectionExpression(), - ParameterUsage.RESTRICT, - session - ), + (jdbcValue, jdbcValueMapping) -> { + jdbcValueBindings.bindValue( + jdbcValue, + jdbcValueMapping, + ParameterUsage.RESTRICT + ); + }, session ); 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 0e58075dd7..413f05d6eb 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 @@ -91,8 +91,7 @@ private void deleteRows(Object key, PersistentCollection collection, SharedSe (jdbcValue, jdbcValueMapping) -> jdbcValueBindings.bindValue( jdbcValue, jdbcValueMapping, - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ) ); @@ -154,8 +153,7 @@ private int insertRows(Object key, PersistentCollection collection, SharedSes (jdbcValue, jdbcValueMapping, usage) -> jdbcValueBindings.bindValue( jdbcValue, jdbcValueMapping, - usage, - session + usage ) ); 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 cd1a1e39a2..aab195d137 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 @@ -129,8 +129,7 @@ private boolean processRow( (jdbcValue, jdbcValueMapping, usage) -> mutationExecutor.getJdbcValueBindings().bindValue( jdbcValue, jdbcValueMapping, - usage, - session + usage ) ); @@ -143,8 +142,7 @@ private boolean processRow( (jdbcValue, jdbcValueMapping) -> mutationExecutor.getJdbcValueBindings().bindValue( jdbcValue, jdbcValueMapping, - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ) ); 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 c7683f0364..c8b91556c9 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 @@ -14,7 +14,6 @@ import org.hibernate.engine.jdbc.mutation.ParameterUsage; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.persister.entity.AbstractEntityPersister; import org.hibernate.sql.model.ModelMutationLogging; @@ -124,8 +123,7 @@ protected void bindPartitionColumnValueBindings( jdbcValueBindings.bindValue( value, jdbcValueMapping, - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ); } }, diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java index f83eced2d9..68340372c2 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java @@ -19,6 +19,7 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.EntityRowIdMapping; +import org.hibernate.metamodel.mapping.EntityVersionMapping; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SingularAttributeMapping; import org.hibernate.persister.entity.AbstractEntityPersister; @@ -29,7 +30,6 @@ import org.hibernate.sql.model.ast.builder.TableDeleteBuilder; import org.hibernate.sql.model.ast.builder.TableDeleteBuilderSkipped; import org.hibernate.sql.model.ast.builder.TableDeleteBuilderStandard; -import org.hibernate.sql.model.ast.builder.TableMutationBuilder; import static org.hibernate.engine.jdbc.mutation.internal.ModelMutationHelper.identifiedResultsCheck; @@ -175,13 +175,11 @@ private void applyAllOrDirtyLocking( // presumably the SQL was generated with `is null` return; } - jdbcValueBindings.bindValue( jdbcValue, mutationTableName, jdbcValueMapping.getSelectionExpression(), - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ); }, session @@ -196,13 +194,14 @@ private void applyVersionLocking( Object version, SharedSessionContractImplementor session, JdbcValueBindings jdbcValueBindings) { - if ( version != null && entityPersister().getVersionMapping() != null ) { + final AbstractEntityPersister persister = entityPersister(); + final EntityVersionMapping versionMapping = persister.getVersionMapping(); + if ( version != null && versionMapping != null ) { jdbcValueBindings.bindValue( version, - entityPersister().getIdentifierTableMapping().getTableName(), - entityPersister().getVersionMapping().getSelectionExpression(), - ParameterUsage.RESTRICT, - session + persister.physicalTableNameForMutation( versionMapping ), + versionMapping.getSelectionExpression(), + ParameterUsage.RESTRICT ); } } @@ -240,20 +239,20 @@ private static void breakDownIdJdbcValues( rowId, tableDetails.getTableName(), rowIdMapping.getRowIdName(), - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ); } else { tableDetails.getKeyMapping().breakDownKeyJdbcValues( id, - (jdbcValue, columnMapping) -> jdbcValueBindings.bindValue( - jdbcValue, - tableDetails.getTableName(), - columnMapping.getColumnName(), - ParameterUsage.RESTRICT, - session - ), + (jdbcValue, columnMapping) -> { + jdbcValueBindings.bindValue( + jdbcValue, + tableDetails.getTableName(), + columnMapping.getColumnName(), + ParameterUsage.RESTRICT + ); + }, session ); } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinator.java index 1c4ba4dd6d..6996d1ccb5 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinator.java @@ -223,13 +223,14 @@ private static void breakDownJdbcValue( final String tableName = tableDetails.getTableName(); tableDetails.getKeyMapping().breakDownKeyJdbcValues( id, - (jdbcValue, columnMapping) -> jdbcValueBindings.bindValue( - jdbcValue, - tableName, - columnMapping.getColumnName(), - ParameterUsage.SET, - session - ), + (jdbcValue, columnMapping) -> { + jdbcValueBindings.bindValue( + jdbcValue, + tableName, + columnMapping.getColumnName(), + ParameterUsage.SET + ); + }, session ); } @@ -248,8 +249,7 @@ private void decomposeAttribute( jdbcValue, entityPersister().physicalTableNameForMutation( selectableMapping ), selectableMapping.getSelectionExpression(), - ParameterUsage.SET, - session + ParameterUsage.SET ); } }, 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 2f5650922a..db8be7ad4d 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 @@ -450,20 +450,20 @@ protected void doVersionUpdate( version, mutatingTableDetails.getTableName(), versionMapping.getSelectionExpression(), - ParameterUsage.SET, - session + ParameterUsage.SET ); // restrict the key mutatingTableDetails.getKeyMapping().breakDownKeyJdbcValues( id, - (jdbcValue, columnMapping) -> mutationExecutor.getJdbcValueBindings().bindValue( - jdbcValue, - mutatingTableDetails.getTableName(), - columnMapping.getSelectionExpression(), - ParameterUsage.RESTRICT, - session - ), + (jdbcValue, columnMapping) -> { + mutationExecutor.getJdbcValueBindings().bindValue( + jdbcValue, + mutatingTableDetails.getTableName(), + columnMapping.getColumnName(), + ParameterUsage.RESTRICT + ); + }, session ); @@ -472,8 +472,7 @@ protected void doVersionUpdate( oldVersion, mutatingTableDetails.getTableName(), versionMapping.getSelectionExpression(), - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ); try { @@ -798,14 +797,13 @@ private static void optimisticLock( JdbcValueBindings jdbcValueBindings, EntityTableMapping tableMapping, IncludedAttributeAnalysis attributeAnalysis) { - attributeAnalysis.columnLockingAnalyses.forEach( (columnLockingAnalysis) -> { + attributeAnalysis.columnLockingAnalyses.forEach( columnLockingAnalysis -> { if ( columnLockingAnalysis.getLockValue() != null ) { jdbcValueBindings.bindValue( columnLockingAnalysis.getLockValue(), tableMapping.getTableName(), columnLockingAnalysis.getReadExpression(), - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ); } } ); @@ -824,20 +822,20 @@ private void breakDownKeyJdbcValues( rowId, tableMapping.getTableName(), entityPersister().getRowIdMapping().getRowIdName(), - ParameterUsage.RESTRICT, - session + ParameterUsage.RESTRICT ); } else { tableMapping.getKeyMapping().breakDownKeyJdbcValues( id, - (jdbcValue, columnMapping) -> jdbcValueBindings.bindValue( - jdbcValue, - tableMapping.getTableName(), - columnMapping.getColumnName(), - ParameterUsage.RESTRICT, - session - ), + (jdbcValue, columnMapping) -> { + jdbcValueBindings.bindValue( + jdbcValue, + tableMapping.getTableName(), + columnMapping.getColumnName(), + ParameterUsage.RESTRICT + ); + }, session ); } @@ -857,8 +855,7 @@ private static void decomposeAttributeMapping( jdbcValue, tableMapping.getTableName(), jdbcMapping.getSelectionExpression(), - ParameterUsage.SET, - session + ParameterUsage.SET ); } }, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java b/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java index 6881c3963b..03115a8eb5 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java @@ -25,7 +25,6 @@ import org.hibernate.engine.jdbc.mutation.spi.BindingGroup; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.MutationStatementPreparer; -import org.hibernate.engine.jdbc.spi.SqlStatementLogger; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.collections.CollectionHelper; @@ -164,7 +163,7 @@ public void performMutation( } } finally { - jdbcValueBindings.afterStatement( tableMapping, session ); + jdbcValueBindings.afterStatement( tableMapping ); } } @@ -347,7 +346,7 @@ private boolean performUpdate( session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() ); - jdbcValueBindings.beforeStatement( statementDetails, session ); + jdbcValueBindings.beforeStatement( statementDetails ); final int rowCount = session.getJdbcCoordinator().getResultSetReturn() .executeUpdate( updateStatement, statementDetails.getSqlString() ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/internal/BatchingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/internal/BatchingTest.java index 5ddaf0f77c..c51d0e371c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/internal/BatchingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jdbc/internal/BatchingTest.java @@ -76,8 +76,8 @@ public void testBatchingUsage() throws Exception { final JdbcValueBindingsImpl jdbcValueBindings = sandboxInsertValueBindings( sessionImpl ); // bind values for #1 - should do nothing at the JDBC level - jdbcValueBindings.bindValue( 1, SANDBOX_TBL, "ID", ParameterUsage.SET, sessionImpl ); - jdbcValueBindings.bindValue( "name", SANDBOX_TBL, "NAME", ParameterUsage.SET, sessionImpl ); + jdbcValueBindings.bindValue( 1, SANDBOX_TBL, "ID", ParameterUsage.SET ); + jdbcValueBindings.bindValue( "name", SANDBOX_TBL, "NAME", ParameterUsage.SET ); assertThat( batchObserver.getExplicitExecutionCount() ).isEqualTo( 0 ); assertThat( batchObserver.getImplicitExecutionCount() ).isEqualTo( 0 ); assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isFalse(); @@ -89,8 +89,8 @@ public void testBatchingUsage() throws Exception { assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isTrue(); // bind values for #2 - again, nothing at JDBC level (we have statement from earlier) - jdbcValueBindings.bindValue( 2, SANDBOX_TBL, "ID", ParameterUsage.SET, sessionImpl ); - jdbcValueBindings.bindValue( "another name", SANDBOX_TBL, "NAME", ParameterUsage.SET, sessionImpl ); + jdbcValueBindings.bindValue( 2, SANDBOX_TBL, "ID", ParameterUsage.SET ); + jdbcValueBindings.bindValue( "another name", SANDBOX_TBL, "NAME", ParameterUsage.SET ); assertThat( batchObserver.getExplicitExecutionCount() ).isEqualTo( 0 ); assertThat( batchObserver.getImplicitExecutionCount() ).isEqualTo( 0 ); @@ -174,7 +174,8 @@ public JdbcMapping getJdbcMapping() { } throw new IllegalArgumentException( "Unknown column : " + columnName ); - } + }, + session ); } @@ -205,8 +206,8 @@ public void testSessionBatchingUsage() throws Exception { final JdbcValueBindingsImpl jdbcValueBindings = sandboxInsertValueBindings( sessionImpl ); // bind values for #1 - this does nothing at the JDBC level - jdbcValueBindings.bindValue( 1, SANDBOX_TBL, "ID", ParameterUsage.SET, sessionImpl ); - jdbcValueBindings.bindValue( "name", SANDBOX_TBL, "NAME", ParameterUsage.SET, sessionImpl ); + jdbcValueBindings.bindValue( 1, SANDBOX_TBL, "ID", ParameterUsage.SET ); + jdbcValueBindings.bindValue( "name", SANDBOX_TBL, "NAME", ParameterUsage.SET ); assertThat( batchObserver.getExplicitExecutionCount() ).isEqualTo( 0 ); assertThat( batchObserver.getImplicitExecutionCount() ).isEqualTo( 0 ); assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isFalse(); @@ -218,8 +219,8 @@ public void testSessionBatchingUsage() throws Exception { assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isTrue(); // bind values for #2 - this does nothing at the JDBC level : we do still have the statement defining the batch - jdbcValueBindings.bindValue( 2, SANDBOX_TBL, "ID", ParameterUsage.SET, sessionImpl ); - jdbcValueBindings.bindValue( "another name", SANDBOX_TBL, "NAME", ParameterUsage.SET, sessionImpl ); + jdbcValueBindings.bindValue( 2, SANDBOX_TBL, "ID", ParameterUsage.SET ); + jdbcValueBindings.bindValue( "another name", SANDBOX_TBL, "NAME", ParameterUsage.SET ); assertThat( batchObserver.getExplicitExecutionCount() ).isEqualTo( 0 ); assertThat( batchObserver.getImplicitExecutionCount() ).isEqualTo( 0 ); assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isTrue(); @@ -231,8 +232,8 @@ public void testSessionBatchingUsage() throws Exception { assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isTrue(); // bind values for #3 - this does nothing at the JDBC level : we do still have the statement defining the batch - jdbcValueBindings.bindValue( 3, SANDBOX_TBL, "ID", ParameterUsage.SET, sessionImpl ); - jdbcValueBindings.bindValue( "yet another name", SANDBOX_TBL, "NAME", ParameterUsage.SET, sessionImpl ); + jdbcValueBindings.bindValue( 3, SANDBOX_TBL, "ID", ParameterUsage.SET ); + jdbcValueBindings.bindValue( "yet another name", SANDBOX_TBL, "NAME", ParameterUsage.SET ); assertThat( batchObserver.getExplicitExecutionCount() ).isEqualTo( 0 ); assertThat( batchObserver.getImplicitExecutionCount() ).isEqualTo( 0 ); assertThat( jdbcCoordinator.getLogicalConnection().getResourceRegistry().hasRegisteredResources() ).isTrue();