Skip to content

Commit 93c283a

Browse files
committed
HHH-18563 Auto-flush entities passed as parameters to queries
1 parent 1ce5575 commit 93c283a

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

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

Lines changed: 15 additions & 0 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;
@@ -675,6 +676,7 @@ else if ( parameterType instanceof PluralAttributeMapping ) {
675676
}
676677
}
677678
else if ( parameterType instanceof EntityMappingType ) {
679+
addAffectedTable( jdbcParameterBindings, bindValue, session );
678680
final EntityIdentifierMapping identifierMapping = ( (EntityMappingType) parameterType ).getIdentifierMapping();
679681
final EntityMappingType entityMapping = identifierMapping.findContainingEntityMapping();
680682
parameterType = identifierMapping;
@@ -683,6 +685,7 @@ else if ( parameterType instanceof EntityMappingType ) {
683685
}
684686
}
685687
else if ( parameterType instanceof EntityAssociationMapping ) {
688+
addAffectedTable( jdbcParameterBindings, bindValue, session );
686689
EntityAssociationMapping association = (EntityAssociationMapping) parameterType;
687690
if ( association.getSideNature() == ForeignKeyDescriptor.Nature.TARGET ) {
688691
// If the association is the target, we must use the identifier of the EntityMappingType
@@ -712,6 +715,18 @@ else if ( parameterType instanceof JavaObjectType ) {
712715
assert offset == jdbcParams.size();
713716
}
714717

718+
private static void addAffectedTable(
719+
JdbcParameterBindings jdbcParameterBindings,
720+
Object bindValue,
721+
SharedSessionContractImplementor session) {
722+
if ( bindValue != null ) {
723+
final EntityEntry entry = session.getPersistenceContext().getEntry( bindValue );
724+
if ( entry != null ) {
725+
jdbcParameterBindings.addAffectedTableName( entry.getPersister().getTableName() );
726+
}
727+
}
728+
}
729+
715730
public static Bindable determineParameterType(
716731
QueryParameterBinding<?> binding,
717732
QueryParameterImplementor<?> parameter,

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)