Skip to content

Commit 4fd5755

Browse files
committed
HHH-18563 Auto-flush entities passed as parameters to queries
1 parent 5cd1823 commit 4fd5755

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.StringTokenizer;
2222
import java.util.function.Function;
2323

24+
import org.hibernate.engine.spi.EntityEntry;
2425
import org.hibernate.engine.spi.SessionFactoryImplementor;
2526
import org.hibernate.engine.spi.SharedSessionContractImplementor;
2627
import org.hibernate.internal.util.collections.CollectionHelper;
@@ -662,28 +663,32 @@ private static void createValueBindings(
662663
if ( parameterType == null ) {
663664
throw new SqlTreeCreationException( "Unable to interpret mapping-model type for Query parameter : " + domainParam );
664665
}
665-
else if ( parameterType instanceof PluralAttributeMapping ) {
666+
else if ( parameterType instanceof PluralAttributeMapping pluralAttributeMapping ) {
666667
// Default to the collection element
667-
parameterType = ( (PluralAttributeMapping) parameterType ).getElementDescriptor();
668+
parameterType = pluralAttributeMapping.getElementDescriptor();
668669
}
669670

670-
if ( parameterType instanceof EntityIdentifierMapping ) {
671-
final EntityIdentifierMapping identifierMapping = (EntityIdentifierMapping) parameterType;
671+
if ( parameterType instanceof EntityIdentifierMapping identifierMapping) {
672672
final EntityMappingType entityMapping = identifierMapping.findContainingEntityMapping();
673673
if ( entityMapping.getRepresentationStrategy().getInstantiator().isInstance( bindValue, session.getFactory() ) ) {
674674
bindValue = identifierMapping.getIdentifierIfNotUnsaved( bindValue, session );
675675
}
676676
}
677-
else if ( parameterType instanceof EntityMappingType ) {
678-
final EntityIdentifierMapping identifierMapping = ( (EntityMappingType) parameterType ).getIdentifierMapping();
677+
else if ( parameterType instanceof EntityMappingType entityMappingType ) {
678+
jdbcParameterBindings.addAffectedTableName(
679+
entityMappingType.getEntityPersister().getTableName()
680+
);
681+
final EntityIdentifierMapping identifierMapping = entityMappingType.getIdentifierMapping();
679682
final EntityMappingType entityMapping = identifierMapping.findContainingEntityMapping();
680683
parameterType = identifierMapping;
681684
if ( entityMapping.getRepresentationStrategy().getInstantiator().isInstance( bindValue, session.getFactory() ) ) {
682685
bindValue = identifierMapping.getIdentifierIfNotUnsaved( bindValue, session );
683686
}
684687
}
685-
else if ( parameterType instanceof EntityAssociationMapping ) {
686-
EntityAssociationMapping association = (EntityAssociationMapping) parameterType;
688+
else if ( parameterType instanceof EntityAssociationMapping association) {
689+
jdbcParameterBindings.addAffectedTableName(
690+
association.getAssociatedEntityMappingType().getEntityPersister().getTableName()
691+
);
687692
if ( association.getSideNature() == ForeignKeyDescriptor.Nature.TARGET ) {
688693
// If the association is the target, we must use the identifier of the EntityMappingType
689694
bindValue = association.getAssociatedEntityMappingType().getIdentifierMapping()

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,9 @@ private static CteContainer matchCteContainerByStatement(final Statement stmt, f
793793
public T translate(JdbcParameterBindings jdbcParameterBindings, QueryOptions queryOptions) {
794794
try {
795795
this.jdbcParameterBindings = jdbcParameterBindings;
796+
if ( jdbcParameterBindings != null && jdbcParameterBindings.getAffectedTableNames() != null ) {
797+
affectedTableNames.addAll( jdbcParameterBindings.getAffectedTableNames() );
798+
}
796799

797800
final Statement statement = statementStack.pop();
798801

hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcParameterBindingsImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88

99
import java.util.Collection;
1010
import java.util.Collections;
11+
import java.util.HashSet;
1112
import java.util.IdentityHashMap;
1213
import java.util.List;
1314
import java.util.Map;
15+
import java.util.Set;
1416
import java.util.function.BiConsumer;
1517

1618
import org.hibernate.dialect.Dialect;
@@ -37,6 +39,7 @@
3739
*/
3840
public class JdbcParameterBindingsImpl implements JdbcParameterBindings {
3941
private Map<JdbcParameter, JdbcParameterBinding> bindingMap;
42+
private Set<String> affectedTableName;
4043

4144
public JdbcParameterBindingsImpl(int expectedParameterCount) {
4245
if ( expectedParameterCount > 0 ) {
@@ -185,4 +188,17 @@ public void clear() {
185188
bindingMap.clear();
186189
}
187190
}
191+
192+
@Override
193+
public Set<String> getAffectedTableNames() {
194+
return affectedTableName;
195+
}
196+
197+
@Override
198+
public void addAffectedTableName(String tableName) {
199+
if ( affectedTableName == null ) {
200+
affectedTableName = new HashSet<>( bindingMap.size() );
201+
}
202+
affectedTableName.add( tableName );
203+
}
188204
}

hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcParameterBindings.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.util.Collection;
1010
import java.util.Collections;
11+
import java.util.Set;
1112
import java.util.function.BiConsumer;
1213

1314
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -106,4 +107,12 @@ private void createAndAddBinding(
106107
)
107108
);
108109
}
110+
111+
default Set<String> getAffectedTableNames(){
112+
return null;
113+
}
114+
115+
default void addAffectedTableName(String tableName){
116+
117+
}
109118
}

0 commit comments

Comments
 (0)