From 2e4211e8eb1cd3ddc45211d122d09b546822c75c Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Fri, 23 Jun 2023 12:04:44 +0200 Subject: [PATCH] HHH-16821 Fail to delete entity with a composite id using an @IdClass with one of its fields mapped from the id of a @ManyToOne association --- .../internal/EmbeddableMappingTypeImpl.java | 44 ++++++++++--------- .../entity/mutation/DeleteCoordinator.java | 4 +- 2 files changed, 26 insertions(+), 22 deletions(-) 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 7ac22d6d7c..5534cb19bc 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 @@ -635,31 +635,35 @@ public class EmbeddableMappingTypeImpl extends AbstractEmbeddableMapping impleme for ( int i = 0; i < size; i++ ) { final AttributeMapping attributeMapping = attributeMappings.get( i ); - final Object attributeValue = values[ i ]; - span += attributeMapping.breakDownJdbcValues( - attributeValue, - offset + span, - x, - y, - valueConsumer, - session - ); + if ( !attributeMapping.isPluralAttributeMapping() ) { + final Object attributeValue = values[i]; + span += attributeMapping.breakDownJdbcValues( + attributeValue, + offset + span, + x, + y, + valueConsumer, + session + ); + } } } else { for ( int i = 0; i < size; i++ ) { final AttributeMapping attributeMapping = attributeMappings.get( i ); - final Object attributeValue = domainValue == null - ? null - : attributeMapping.getPropertyAccess().getGetter().get( domainValue ); - span += attributeMapping.breakDownJdbcValues( - attributeValue, - offset + span, - x, - y, - valueConsumer, - session - ); + if ( !attributeMapping.isPluralAttributeMapping() ) { + final Object attributeValue = domainValue == null + ? null + : attributeMapping.getPropertyAccess().getGetter().get( domainValue ); + span += attributeMapping.breakDownJdbcValues( + attributeValue, + offset + span, + x, + y, + valueConsumer, + session + ); + } } } return span; 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 ef60792ac7..e7f28996b6 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 @@ -165,7 +165,7 @@ public class DeleteCoordinator extends AbstractMutationCoordinator { 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 ) ) instanceof SingularAttributeMapping ) { + if ( versionability[attributeIndex] && !( attribute = persister.getAttributeMapping( attributeIndex ) ).isPluralAttributeMapping() ) { final Object loadedValue = loadedState[attributeIndex]; if ( loadedValue != null ) { final String mutationTableName = persister.getAttributeMutationTableName( attributeIndex ); @@ -424,7 +424,7 @@ public class DeleteCoordinator extends AbstractMutationCoordinator { 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 ) ) instanceof SingularAttributeMapping ) { + if ( versionability[attributeIndex] && !( attribute = persister.getAttributeMapping( attributeIndex ) ).isPluralAttributeMapping() ) { breakDownJdbcValues( mutationGroupBuilder, session, attribute, loadedState[attributeIndex] ); } }