Skip to content

Commit 1a9bd7d

Browse files
committed
Re-enabled additional test and fix issue with native queries not flushing session
1 parent e3947b3 commit 1a9bd7d

File tree

11 files changed

+107
-11
lines changed

11 files changed

+107
-11
lines changed

hibernate-core/src/main/java/org/hibernate/engine/query/internal/NativeQueryInterpreterStandardImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ public <R> NativeSelectQueryPlan<R> createQueryPlan(
3737
queryDefinition.getAffectedTableNames(),
3838
queryDefinition.getQueryParameterList(),
3939
queryDefinition.getJdbcValuesMappingProducer(),
40-
queryDefinition.getRowTransformer()
40+
queryDefinition.getRowTransformer(),
41+
sessionFactory
4142
);
4243
}
4344
}

hibernate-core/src/main/java/org/hibernate/engine/query/spi/NativeQueryInterpreter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ default <R> NativeSelectQueryPlan<R> createQueryPlan(
4646
queryDefinition.getAffectedTableNames(),
4747
queryDefinition.getQueryParameterList(),
4848
queryDefinition.getJdbcValuesMappingProducer(),
49-
queryDefinition.getRowTransformer()
49+
queryDefinition.getRowTransformer(),
50+
sessionFactory
5051
);
5152
}
5253

hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,9 @@ protected <T> QueryImplementor<T> buildNamedQuery(String queryName, Class<T> res
788788
.getNativeQueryMemento( queryName );
789789

790790
if ( namedNativeDescriptor != null ) {
791+
if( resultType == null){
792+
resultType = (Class<T>) namedNativeDescriptor.getResultMappingClass();
793+
}
791794
NativeQueryImplementor query = namedNativeDescriptor.toQuery( this, resultType );
792795
query.setComment( "dynamic native SQL query" );
793796
applyQuerySettingsAndHints( query );

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedForeignKeyDescriptor.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88

99
import java.util.ArrayList;
1010
import java.util.Collection;
11+
import java.util.Iterator;
1112
import java.util.List;
1213
import java.util.function.Consumer;
1314

1415
import org.hibernate.HibernateException;
16+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1517
import org.hibernate.metamodel.internal.AbstractCompositeIdentifierMapping;
1618
import org.hibernate.metamodel.mapping.AssociationKey;
19+
import org.hibernate.metamodel.mapping.AttributeMapping;
1720
import org.hibernate.metamodel.mapping.ColumnConsumer;
1821
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
1922
import org.hibernate.metamodel.mapping.EntityMappingType;
@@ -49,7 +52,7 @@
4952
*/
5053
public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor, ModelPart {
5154

52-
private final EmbeddableValuedModelPart mappingType;
55+
private final AbstractCompositeIdentifierMapping mappingType;
5356
private final String keyColumnContainingTable;
5457
private final List<String> keyColumnExpressions;
5558
private final String targetColumnContainingTable;
@@ -170,7 +173,7 @@ public DomainResult createDomainResult(
170173
final TableReference tableReference = tableGroup.resolveTableReference( keyColumnContainingTable );
171174
final String identificationVariable = tableReference.getIdentificationVariable();
172175
int size = keyColumnExpressions.size();
173-
List<SqlSelection> sqlSelections = new ArrayList<>(size);
176+
List<SqlSelection> sqlSelections = new ArrayList<>( size );
174177
for ( int i = 0; i < size; i++ ) {
175178
final String columnExpression = keyColumnExpressions.get( i );
176179
final JdbcMapping jdbcMapping = jdbcMappings.get( i );
@@ -395,7 +398,7 @@ public <T> DomainResult<T> createDomainResult(
395398
final TableReference tableReference = tableGroup.resolveTableReference( keyColumnContainingTable );
396399
final String identificationVariable = tableReference.getIdentificationVariable();
397400
int size = keyColumnExpressions.size();
398-
List<SqlSelection> sqlSelections = new ArrayList<>(size);
401+
List<SqlSelection> sqlSelections = new ArrayList<>( size );
399402
for ( int i = 0; i < size; i++ ) {
400403
final String columnExpression = keyColumnExpressions.get( i );
401404
final JdbcMapping jdbcMapping = jdbcMappings.get( i );
@@ -443,4 +446,18 @@ public void visitJdbcTypes(
443446
Consumer<JdbcMapping> action, Clause clause, TypeConfiguration typeConfiguration) {
444447
mappingType.visitJdbcTypes( action, clause, typeConfiguration );
445448
}
449+
450+
@Override
451+
public void visitDisassembledJdbcValues(
452+
Object value,
453+
Clause clause,
454+
JdbcValuesConsumer valuesConsumer,
455+
SharedSessionContractImplementor session) {
456+
mappingType.visitDisassembledJdbcValues( value, clause, valuesConsumer, session );
457+
}
458+
459+
@Override
460+
public Object disassemble(Object value, SharedSessionContractImplementor session) {
461+
return mappingType.disassemble( value, session );
462+
}
446463
}

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedIdentifierMappingImpl.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
package org.hibernate.metamodel.mapping.internal;
88

99
import java.util.Collection;
10+
import java.util.Iterator;
1011

1112
import org.hibernate.engine.spi.SessionFactoryImplementor;
1213
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1314
import org.hibernate.metamodel.internal.AbstractCompositeIdentifierMapping;
15+
import org.hibernate.metamodel.mapping.AttributeMapping;
1416
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
1517
import org.hibernate.metamodel.mapping.EntityMappingType;
1618
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
1719
import org.hibernate.metamodel.mapping.StateArrayContributorMetadataAccess;
1820
import org.hibernate.property.access.spi.PropertyAccess;
1921
import org.hibernate.proxy.HibernateProxy;
22+
import org.hibernate.sql.ast.Clause;
2023

2124
/**
2225
* Support for {@link javax.persistence.EmbeddedId}
@@ -108,4 +111,28 @@ public String getAttributeName() {
108111
return name;
109112
}
110113

114+
@Override
115+
public void visitDisassembledJdbcValues(
116+
Object value,
117+
Clause clause,
118+
JdbcValuesConsumer valuesConsumer,
119+
SharedSessionContractImplementor session) {
120+
getEmbeddableTypeDescriptor().visitDisassembledJdbcValues( value, clause, valuesConsumer, session );
121+
}
122+
123+
@Override
124+
public Object disassemble(Object value, SharedSessionContractImplementor session) {
125+
final Collection<SingularAttributeMapping> attributeMappings = getAttributes();
126+
127+
Object[] result = new Object[attributeMappings.size()];
128+
int i = 0;
129+
final Iterator<SingularAttributeMapping> iterator = attributeMappings.iterator();
130+
while ( iterator.hasNext() ) {
131+
AttributeMapping mapping = iterator.next();
132+
Object o = mapping.getPropertyAccess().getGetter().get( value );
133+
result[i] = mapping.disassemble( o, session );
134+
i++;
135+
}
136+
return result;
137+
}
111138
}

hibernate-core/src/main/java/org/hibernate/query/results/ResultSetMappingImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@
66
*/
77
package org.hibernate.query.results;
88

9+
import java.io.Serializable;
910
import java.util.ArrayList;
1011
import java.util.Collections;
1112
import java.util.HashMap;
13+
import java.util.HashSet;
1214
import java.util.List;
1315
import java.util.Map;
16+
import java.util.Set;
1417
import java.util.function.BiConsumer;
1518
import java.util.function.Consumer;
1619

1720
import org.hibernate.Incubating;
1821
import org.hibernate.Internal;
1922
import org.hibernate.NotYetImplementedFor6Exception;
2023
import org.hibernate.engine.spi.SessionFactoryImplementor;
24+
import org.hibernate.internal.util.StringHelper;
25+
import org.hibernate.internal.util.collections.CollectionHelper;
2126
import org.hibernate.metamodel.mapping.BasicValuedMapping;
27+
import org.hibernate.persister.entity.EntityPersister;
2228
import org.hibernate.query.named.NamedResultSetMappingMemento;
2329
import org.hibernate.query.results.dynamic.DynamicFetchBuilderLegacy;
2430
import org.hibernate.sql.ast.spi.SqlSelection;
@@ -101,6 +107,19 @@ public void addLegacyFetchBuilder(DynamicFetchBuilderLegacy fetchBuilder) {
101107
}
102108
}
103109

110+
@Override
111+
public void addAffectedTableNames(Set<String> affectedTableNames, SessionFactoryImplementor sessionFactory) {
112+
if ( StringHelper.isEmpty( mappingIdentifier ) ) {
113+
return;
114+
}
115+
EntityPersister entityDescriptor = sessionFactory.getMetamodel().findEntityDescriptor( mappingIdentifier );
116+
if ( entityDescriptor == null ) {
117+
return;
118+
}
119+
120+
Collections.addAll( affectedTableNames, (String[]) entityDescriptor.getQuerySpaces());
121+
}
122+
104123
@Override
105124
public JdbcValuesMapping resolve(
106125
JdbcValuesMetadata jdbcResultsMetadata,

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,10 @@ public NativeQueryImpl(
208208
SharedSessionContractImplementor session) {
209209
this(
210210
memento,
211-
() -> new ResultSetMappingImpl( resultJavaType.getName() ),
211+
() -> {
212+
final String mappingIdentifier = resultJavaType != null ? resultJavaType.getName() : null;
213+
return new ResultSetMappingImpl( mappingIdentifier );
214+
},
212215
(resultSetMapping, querySpaceConsumer, context) -> {
213216
if ( resultJavaType != null ) {
214217

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeSelectQueryPlanImpl.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88

99
import java.util.ArrayList;
1010
import java.util.Collections;
11+
import java.util.HashSet;
1112
import java.util.List;
1213
import java.util.Set;
1314

1415
import org.hibernate.ScrollMode;
16+
import org.hibernate.engine.spi.SessionFactoryImplementor;
1517
import org.hibernate.metamodel.mapping.BasicValuedMapping;
1618
import org.hibernate.metamodel.mapping.JdbcMapping;
1719
import org.hibernate.metamodel.model.domain.AllowableParameterType;
@@ -50,14 +52,21 @@ public NativeSelectQueryPlanImpl(
5052
Set<String> affectedTableNames,
5153
List<QueryParameterImplementor<?>> parameterList,
5254
JdbcValuesMappingProducer resultSetMapping,
53-
RowTransformer<R> rowTransformer) {
55+
RowTransformer<R> rowTransformer,
56+
SessionFactoryImplementor sessionFactory) {
5457
this.sql = sql;
55-
this.affectedTableNames = affectedTableNames;
5658
this.parameterList = parameterList;
5759
this.resultSetMapping = resultSetMapping;
5860
this.rowTransformer = rowTransformer != null
5961
? rowTransformer
6062
: RowTransformerPassThruImpl.instance();
63+
if ( affectedTableNames == null ) {
64+
affectedTableNames = new HashSet<>();
65+
}
66+
if ( resultSetMapping != null ) {
67+
resultSetMapping.addAffectedTableNames( affectedTableNames, sessionFactory );
68+
}
69+
this.affectedTableNames = affectedTableNames;
6170
}
6271

6372
@Override
@@ -97,6 +106,8 @@ public List<R> performList(ExecutionContext executionContext) {
97106
);
98107
}
99108

109+
executionContext.getSession().autoFlushIfRequired( affectedTableNames );
110+
100111
final JdbcSelect jdbcSelect = new JdbcSelect(
101112
sql,
102113
jdbcParameterBinders,

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingProducerStandard.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.hibernate.sql.results.jdbc.internal;
88

99
import java.util.List;
10+
import java.util.Set;
1011

1112
import org.hibernate.engine.spi.SessionFactoryImplementor;
1213
import org.hibernate.sql.ast.spi.SqlSelection;
@@ -32,6 +33,11 @@ public JdbcValuesMappingProducerStandard(List<SqlSelection> sqlSelections, List<
3233
resolvedMapping = new StandardJdbcValuesMapping( sqlSelections, domainResults );
3334
}
3435

36+
// @Override
37+
// public void addAffectedTableNames(Set<String> affectedTableNames, SessionFactoryImplementor sessionFactory) {
38+
//
39+
// }
40+
3541
@Override
3642
public JdbcValuesMapping resolve(
3743
JdbcValuesMetadata jdbcResultsMetadata,

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesMappingProducer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
*/
77
package org.hibernate.sql.results.jdbc.spi;
88

9+
import java.util.Set;
10+
911
import org.hibernate.Incubating;
12+
import org.hibernate.NotYetImplementedFor6Exception;
1013
import org.hibernate.engine.spi.SessionFactoryImplementor;
1114
import org.hibernate.query.results.ResultSetMapping;
1215

@@ -31,4 +34,9 @@ public interface JdbcValuesMappingProducer {
3134
JdbcValuesMapping resolve(
3235
JdbcValuesMetadata jdbcResultsMetadata,
3336
SessionFactoryImplementor sessionFactory);
37+
38+
default void addAffectedTableNames(Set<String> affectedTableNames, SessionFactoryImplementor sessionFactory) {
39+
throw new NotYetImplementedFor6Exception( getClass() );
40+
}
41+
3442
}

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/idclass/xml/IdClassXmlTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*
2323
* @author Hardy Ferentschik
2424
*/
25-
@FailureExpected( jiraKey = "HHH-4282" )
25+
//@FailureExpected( jiraKey = "HHH-4282" )
2626
@DomainModel(
2727
annotatedClasses = HabitatSpeciesLink.class,
2828
xmlMappings = "org/hibernate/orm/test/annotations/idclass/xml/HabitatSpeciesLink.xml"
@@ -34,8 +34,8 @@ public void testEntityMappingPropertiesAreNotIgnored(SessionFactoryScope scope)
3434
scope.inTransaction(
3535
session -> {
3636
HabitatSpeciesLink link = new HabitatSpeciesLink();
37-
link.setHabitatId( 1l );
38-
link.setSpeciesId( 1l );
37+
link.setHabitatId( 1L );
38+
link.setSpeciesId( 1L );
3939
session.persist( link );
4040

4141
Query q = session.getNamedQuery( "testQuery" );

0 commit comments

Comments
 (0)