Skip to content

Backport of HHH-16900 to 6.2 #6947

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Sep 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.engine.jdbc.mutation.internal;

import org.hibernate.persister.entity.mutation.EntityMutationTarget;
import org.hibernate.sql.model.MutationOperationGroup;

public interface EntityMutationOperationGroup extends MutationOperationGroup {

/**
* The model-part being mutated.
* N.B. it returns a widened type compared to the same method in the super interface.
*/
@Override
EntityMutationTarget getMutationTarget();

@Override
default EntityMutationOperationGroup asEntityMutationOperationGroup() {
return this;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ public class MutationExecutorPostInsert implements MutationExecutor, JdbcValueBi

protected final JdbcValueBindingsImpl valueBindings;

public MutationExecutorPostInsert(MutationOperationGroup mutationOperationGroup, SharedSessionContractImplementor session) {
this.mutationTarget = (EntityMutationTarget) mutationOperationGroup.getMutationTarget();
public MutationExecutorPostInsert(EntityMutationOperationGroup mutationOperationGroup, SharedSessionContractImplementor session) {
this.mutationTarget = mutationOperationGroup.getMutationTarget();
this.valueBindings = new JdbcValueBindingsImpl(
MutationType.INSERT,
mutationTarget,
Expand All @@ -70,17 +70,16 @@ public MutationExecutorPostInsert(MutationOperationGroup mutationOperationGroup,
);
this.mutationOperationGroup = mutationOperationGroup;

final PreparableMutationOperation identityInsertOperation = mutationOperationGroup.getOperation( mutationTarget.getIdentifierTableName() );
final PreparableMutationOperation identityInsertOperation = (PreparableMutationOperation) mutationOperationGroup.getOperation( mutationTarget.getIdentifierTableName() );
this.identityInsertStatementDetails = ModelMutationHelper.identityPreparation(
identityInsertOperation,
session
);

List<PreparableMutationOperation> secondaryTableMutations = null;

final List<MutationOperation> operations = mutationOperationGroup.getOperations();
for ( int i = 0; i < operations.size(); i++ ) {
final MutationOperation operation = operations.get( i );
for ( int i = 0; i < mutationOperationGroup.getNumberOfOperations(); i++ ) {
final MutationOperation operation = mutationOperationGroup.getOperation( i );

if ( operation.getTableDetails().isIdentifierTable() ) {
// the identifier table is handled via `identityInsertStatementDetails`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@ public class MutationExecutorPostInsertSingleTable implements MutationExecutor,
private final JdbcValueBindingsImpl valueBindings;

public MutationExecutorPostInsertSingleTable(
MutationOperationGroup mutationOperationGroup,
EntityMutationOperationGroup mutationOperationGroup,
SharedSessionContractImplementor session) {
this.mutationTarget = (EntityMutationTarget) mutationOperationGroup.getMutationTarget();
this.mutationTarget = mutationOperationGroup.getMutationTarget();
this.session = session;

assert mutationOperationGroup.getNumberOfOperations() == 1;

this.operation = mutationOperationGroup.getOperation( mutationTarget.getIdentifierTableName() );
this.operation = (PreparableMutationOperation) mutationOperationGroup.getOperation( mutationTarget.getIdentifierTableName() );
this.identityInsertStatementDetails = identityPreparation( operation, session );

this.valueBindings = new JdbcValueBindingsImpl(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.function.Supplier;

import org.hibernate.engine.jdbc.batch.spi.Batch;
import org.hibernate.engine.jdbc.batch.spi.BatchKey;
Expand All @@ -23,7 +22,6 @@
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementGroup;
import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.sql.model.MutationOperation;
import org.hibernate.sql.model.MutationOperationGroup;
import org.hibernate.sql.model.PreparableMutationOperation;
Expand Down Expand Up @@ -79,12 +77,10 @@ public MutationExecutorStandard(
List<PreparableMutationOperation> nonBatchedJdbcMutations = null;
List<SelfExecutingUpdateOperation> selfExecutingMutations = null;

final List<MutationOperation> operations = mutationOperationGroup.getOperations();

boolean hasAnyNonBatchedJdbcOperations = false;

for ( int i = operations.size() - 1; i >= 0; i-- ) {
final MutationOperation operation = operations.get( i );
for ( int i = mutationOperationGroup.getNumberOfOperations() - 1; i >= 0; i-- ) {
final MutationOperation operation = mutationOperationGroup.getOperation( i );
if ( operation instanceof SelfExecutingUpdateOperation ) {
final SelfExecutingUpdateOperation selfExecutingMutation = (SelfExecutingUpdateOperation) operation;
if ( selfExecutingMutations == null ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package org.hibernate.engine.jdbc.mutation.internal;

import java.util.Map;
import java.util.function.Supplier;

import org.hibernate.cfg.Environment;
import org.hibernate.engine.jdbc.batch.spi.BatchKey;
Expand All @@ -16,11 +15,8 @@
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
import org.hibernate.sql.model.MutationOperation;
import org.hibernate.sql.model.MutationOperationGroup;
import org.hibernate.sql.model.MutationTarget;
import org.hibernate.sql.model.MutationType;
import org.hibernate.sql.model.PreparableMutationOperation;
import org.hibernate.sql.model.SelfExecutingUpdateOperation;
Expand Down Expand Up @@ -58,18 +54,15 @@ public MutationExecutor createExecutor(

final int numberOfOperations = operationGroup.getNumberOfOperations();
final MutationType mutationType = operationGroup.getMutationType();
final MutationTarget<?> mutationTarget = operationGroup.getMutationTarget();
final EntityMutationOperationGroup entityMutationOperationGroup = operationGroup.asEntityMutationOperationGroup();

if ( mutationType == MutationType.INSERT
&& mutationTarget instanceof EntityMutationTarget
&& ( (EntityMutationTarget) mutationTarget ).getIdentityInsertDelegate() != null ) {
assert mutationTarget instanceof EntityMappingType;

&& entityMutationOperationGroup != null
&& entityMutationOperationGroup.getMutationTarget().getIdentityInsertDelegate() != null ) {
if ( numberOfOperations > 1 ) {
return new MutationExecutorPostInsert( operationGroup, session );
return new MutationExecutorPostInsert( entityMutationOperationGroup, session );
}

return new MutationExecutorPostInsertSingleTable( operationGroup, session );
return new MutationExecutorPostInsertSingleTable( entityMutationOperationGroup, session );
}

if ( numberOfOperations == 1 ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.collection.mutation.CollectionMutationTarget;
import org.hibernate.persister.entity.PropertyMapping;
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.ast.spi.FromClauseAccess;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
import org.hibernate.engine.jdbc.mutation.ParameterUsage;
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
import org.hibernate.engine.jdbc.mutation.internal.MutationQueryOptions;
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
Expand Down Expand Up @@ -74,7 +75,6 @@
import org.hibernate.sql.model.ast.RestrictedTableMutation;
import org.hibernate.sql.model.ast.TableUpdate;
import org.hibernate.sql.model.ast.builder.TableUpdateBuilderStandard;
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
import org.hibernate.sql.model.internal.TableUpdateStandard;
import org.hibernate.sql.model.jdbc.JdbcDeleteMutation;
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
Expand Down Expand Up @@ -228,7 +228,7 @@ && hasIndex()

final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor(
() -> new BasicBatchKey( getNavigableRole() + "#INDEX" ),
new MutationOperationGroupSingle( MutationType.UPDATE, this, updateRowOperation ),
MutationOperationGroupFactory.singleOperation( MutationType.UPDATE, this, updateRowOperation ),
session
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@
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.internal.MutationOperationGroupSingle;
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;

import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
Expand All @@ -34,7 +35,7 @@ public class DeleteRowsCoordinatorStandard implements DeleteRowsCoordinator {
private final BasicBatchKey batchKey;
private final MutationExecutorService mutationExecutorService;

private MutationOperationGroupSingle operationGroup;
private MutationOperationGroup operationGroup;

public DeleteRowsCoordinatorStandard(
CollectionMutationTarget mutationTarget,
Expand Down Expand Up @@ -113,11 +114,11 @@ public void deleteRows(PersistentCollection<?> collection, Object key, SharedSes
}
}

private MutationOperationGroupSingle createOperationGroup() {
private MutationOperationGroup createOperationGroup() {
assert mutationTarget.getTargetPart() != null;
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;

final JdbcMutationOperation operation = rowMutationOperations.getDeleteRowOperation();
return new MutationOperationGroupSingle( MutationType.DELETE, mutationTarget, operation );
return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
package org.hibernate.persister.collection.mutation;

import java.util.Iterator;
import java.util.function.Supplier;

import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey;
import org.hibernate.engine.jdbc.batch.spi.BatchKey;
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;
Expand All @@ -22,8 +21,8 @@
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.internal.MutationOperationGroupSingle;
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;

import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
Expand Down Expand Up @@ -135,7 +134,7 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) {
);
}

private MutationOperationGroupSingle createOperationGroup(EntityPersister elementPersister) {
private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) {
assert mutationTarget.getTargetPart() != null;
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;

Expand All @@ -153,16 +152,16 @@ private MutationOperationGroupSingle createOperationGroup(EntityPersister elemen
collectionTableMapping.getDeleteRowDetails()
)
);
return new MutationOperationGroupSingle( MutationType.DELETE, mutationTarget, operation );
return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation );
}

private static class SubclassEntry {

private final BatchKeyAccess batchKeySupplier;

private final MutationOperationGroupSingle operationGroup;
private final MutationOperationGroup operationGroup;

public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroupSingle operationGroup) {
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroup operationGroup) {
this.batchKeySupplier = batchKeySupplier;
this.operationGroup = operationGroup;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@
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.internal.MutationOperationGroupSingle;
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;

import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
Expand All @@ -33,7 +34,7 @@ public class InsertRowsCoordinatorStandard implements InsertRowsCoordinator {
private final BasicBatchKey batchKey;
private final MutationExecutorService mutationExecutorService;

private MutationOperationGroupSingle operationGroup;
private MutationOperationGroup operationGroup;

public InsertRowsCoordinatorStandard(
CollectionMutationTarget mutationTarget,
Expand Down Expand Up @@ -127,11 +128,11 @@ public void insertRows(
}
}

private MutationOperationGroupSingle createOperationGroup() {
private MutationOperationGroup createOperationGroup() {
assert mutationTarget.getTargetPart() != null;
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;

final JdbcMutationOperation operation = rowMutationOperations.getInsertRowOperation();
return new MutationOperationGroupSingle( MutationType.INSERT, mutationTarget, operation );
return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
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;
Expand All @@ -20,8 +21,8 @@
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.internal.MutationOperationGroupSingle;
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;

import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
Expand All @@ -42,7 +43,10 @@ public InsertRowsCoordinatorTablePerSubclass(
ServiceRegistry serviceRegistry) {
this.mutationTarget = mutationTarget;
this.rowMutationOperations = rowMutationOperations;
this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister().getRootEntityDescriptor().getSubclassEntityNames().size()];
this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister()
.getRootEntityDescriptor()
.getSubclassEntityNames()
.size()];
this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class );
}

Expand Down Expand Up @@ -153,7 +157,7 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) {
);
}

private MutationOperationGroupSingle createOperationGroup(EntityPersister elementPersister) {
private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) {
assert mutationTarget.getTargetPart() != null;
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;

Expand All @@ -171,16 +175,16 @@ private MutationOperationGroupSingle createOperationGroup(EntityPersister elemen
collectionTableMapping.getDeleteRowDetails()
)
);
return new MutationOperationGroupSingle( MutationType.INSERT, mutationTarget, operation );
return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation );
}

private static class SubclassEntry {

private final BatchKeyAccess batchKeySupplier;

private final MutationOperationGroupSingle operationGroup;
private final MutationOperationGroup operationGroup;

public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroupSingle operationGroup) {
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroup operationGroup) {
this.batchKeySupplier = batchKeySupplier;
this.operationGroup = operationGroup;
}
Expand Down
Loading