Skip to content

Commit 211c4e0

Browse files
committed
fixed the unsoundness of the coerce() method
1 parent a0a09bf commit 211c4e0

28 files changed

+113
-143
lines changed

hibernate-core/src/main/java/org/hibernate/cache/internal/DefaultCacheKeysFactory.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class DefaultCacheKeysFactory implements CacheKeysFactory {
4545

4646
public static Object staticCreateCollectionKey(Object id, CollectionPersister persister, SessionFactoryImplementor factory, String tenantIdentifier) {
4747
final Type keyType = persister.getKeyType();
48-
final var coercedId = getCoercedId( id, factory, keyType );
48+
final var coercedId = getCoercedId( id, keyType );
4949
final var disassembledKey = keyType.disassemble( coercedId, factory );
5050
final boolean idIsArray = disassembledKey.getClass().isArray();
5151
final String role = persister.getRole();
@@ -56,7 +56,7 @@ public static Object staticCreateCollectionKey(Object id, CollectionPersister pe
5656

5757
public static Object staticCreateEntityKey(Object id, EntityPersister persister, SessionFactoryImplementor factory, String tenantIdentifier) {
5858
final Type keyType = persister.getIdentifierType();
59-
final var coercedId = getCoercedId( id, factory, keyType );
59+
final var coercedId = getCoercedId( id, keyType );
6060
final var disassembledKey = keyType.disassemble( coercedId, factory );
6161
final boolean idIsArray = disassembledKey.getClass().isArray();
6262
final String rootEntityName = persister.getRootEntityName();
@@ -65,9 +65,9 @@ public static Object staticCreateEntityKey(Object id, EntityPersister persister,
6565
: new CacheKeyImplementation( coercedId, disassembledKey, keyType, rootEntityName, tenantIdentifier );
6666
}
6767

68-
private static Object getCoercedId(Object id, SessionFactoryImplementor factory, Type keyType) {
68+
private static Object getCoercedId(Object id, Type keyType) {
6969
return keyType instanceof BasicType<?> basicType
70-
? basicType.getJavaTypeDescriptor().coerce( id, factory::getTypeConfiguration )
70+
? basicType.getJavaTypeDescriptor().coerce( id )
7171
: id;
7272
}
7373

hibernate-core/src/main/java/org/hibernate/cache/internal/EnabledCaching.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,9 @@ public boolean containsEntity(String entityName, Object identifier) {
227227
final var persister = getEntityDescriptor( entityName );
228228
final var cacheAccess = persister.getCacheAccessStrategy();
229229
if ( cacheAccess != null ) {
230-
final Object idValue =
231-
persister.getIdentifierMapping().getJavaType()
232-
.coerce( identifier, sessionFactory::getTypeConfiguration );
233230
final Object key = cacheAccess.generateCacheKey(
234-
idValue,
231+
persister.getIdentifierMapping().getJavaType()
232+
.coerce( identifier ),
235233
persister.getRootEntityDescriptor().getEntityPersister(),
236234
sessionFactory,
237235
null

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractMultiIdEntityLoader.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ private List<T> orderedMultiLoad(
130130
final var lockOptions = lockOptions( loadOptions );
131131

132132
for ( int i = 0; i < ids.length; i++ ) {
133-
final Object id = coerce( session, idType, ids[i] );
133+
final Object id = coerce( idType, ids[i] );
134134
final var entityKey = new EntityKey( id, getLoadable().getEntityPersister() );
135135
if ( !loadFromEnabledCaches( loadOptions, session, id, lockOptions, entityKey, results, i ) ) {
136136
// if we did not hit any of the continues above,
@@ -160,8 +160,8 @@ private List<T> orderedMultiLoad(
160160
return (List<T>) results;
161161
}
162162

163-
private Object coerce(SharedSessionContractImplementor session, JavaType<?> idType, Object id) {
164-
return idCoercionEnabled ? idType.coerce( id, session ) : id;
163+
private Object coerce(JavaType<?> idType, Object id) {
164+
return idCoercionEnabled ? idType.coerce( id ) : id;
165165
}
166166

167167
private static LockOptions lockOptions(MultiIdLoadOptions loadOptions) {
@@ -342,7 +342,7 @@ private <R> List<Object> unresolvedIds(
342342
final var idType = getLoadable().getIdentifierMapping().getJavaType();
343343
List<Object> unresolvedIds = null;
344344
for ( int i = 0; i < ids.length; i++ ) {
345-
final Object id = coerce( session, idType, ids[i] );
345+
final Object id = coerce( idType, ids[i] );
346346
unresolvedIds =
347347
loadFromCaches(
348348
loadOptions,

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public static <K> K[] normalizeKeys(
188188
}
189189
else {
190190
for ( int i = 0; i < keys.length; i++ ) {
191-
typedArray[i] = keyJavaType.coerce( keys[i], session );
191+
typedArray[i] = keyJavaType.cast( keyJavaType.coerce( keys[i] ) );
192192
}
193193
}
194194
return typedArray;

hibernate-core/src/main/java/org/hibernate/loader/internal/IdentifierLoadAccessImpl.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import org.hibernate.graph.GraphSemantic;
2727
import org.hibernate.graph.spi.RootGraphImplementor;
2828
import org.hibernate.persister.entity.EntityPersister;
29-
import org.hibernate.type.descriptor.java.JavaType;
30-
import org.hibernate.type.spi.TypeConfiguration;
3129

3230
import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer;
3331

@@ -37,7 +35,7 @@
3735
* @author Steve Ebersole
3836
*/
3937
// Hibernate Reactive extends this class: see ReactiveIdentifierLoadAccessImpl
40-
public class IdentifierLoadAccessImpl<T> implements IdentifierLoadAccess<T>, JavaType.CoercionContext {
38+
public class IdentifierLoadAccessImpl<T> implements IdentifierLoadAccess<T> {
4139
private final LoadAccessContext context;
4240
private final EntityPersister entityPersister;
4341

@@ -199,7 +197,7 @@ protected Object coerceId(Object id, SessionFactoryImplementor factory) {
199197
final var identifierMapping = entityPersister.getIdentifierMapping();
200198
return identifierMapping.isVirtual()
201199
? id // special case for a class with an @IdClass
202-
: identifierMapping.getJavaType().coerce( id, this );
200+
: identifierMapping.getJavaType().coerce( id );
203201
}
204202
catch ( Exception e ) {
205203
throw new IllegalArgumentException( "Argument '" + id
@@ -233,11 +231,6 @@ private static boolean isLoadByIdComplianceEnabled(SessionFactoryImplementor fac
233231
return factory.getSessionFactoryOptions().getJpaCompliance().isLoadByIdComplianceEnabled();
234232
}
235233

236-
@Override
237-
public TypeConfiguration getTypeConfiguration() {
238-
return context.getSession().getSessionFactory().getTypeConfiguration();
239-
}
240-
241234
@Override
242235
public IdentifierLoadAccess<T> enableFetchProfile(String profileName) {
243236
if ( !context.getSession().getFactory().containsFetchProfileDefinition( profileName ) ) {

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,16 @@
3434
import org.hibernate.sql.results.graph.DomainResult;
3535
import org.hibernate.sql.results.graph.DomainResultCreationState;
3636
import org.hibernate.type.descriptor.java.JavaType;
37-
import org.hibernate.type.spi.TypeConfiguration;
3837

3938
import static org.hibernate.loader.ast.internal.MultiKeyLoadHelper.supportsSqlArrayType;
4039

4140
/**
4241
* Single-attribute NaturalIdMapping implementation
4342
*/
4443
public class SimpleNaturalIdMapping extends AbstractNaturalIdMapping
45-
implements JavaType.CoercionContext, BasicValuedMapping {
44+
implements BasicValuedMapping {
4645
private final SingularAttributeMapping attribute;
4746
private final SessionFactoryImplementor sessionFactory;
48-
private final TypeConfiguration typeConfiguration;
4947

5048
public SimpleNaturalIdMapping(
5149
SingularAttributeMapping attribute,
@@ -54,7 +52,6 @@ public SimpleNaturalIdMapping(
5452
super( declaringType, attribute.getAttributeMetadata().isUpdatable() );
5553
this.attribute = attribute;
5654
this.sessionFactory = creationProcess.getCreationContext().getSessionFactory();
57-
this.typeConfiguration = creationProcess.getCreationContext().getTypeConfiguration();
5855
}
5956

6057
public SingularAttributeMapping getAttribute() {
@@ -143,7 +140,7 @@ public Object normalizeInput(Object incoming) {
143140
final Object normalizedValue = normalizedValue( incoming );
144141
return isLoadByIdComplianceEnabled()
145142
? normalizedValue
146-
: getJavaType().coerce( normalizedValue, this );
143+
: getJavaType().coerce( normalizedValue );
147144
}
148145

149146
private Object normalizedValue(Object incoming) {
@@ -295,11 +292,6 @@ private Dialect getDialect() {
295292
return sessionFactory.getJdbcServices().getDialect();
296293
}
297294

298-
@Override
299-
public TypeConfiguration getTypeConfiguration() {
300-
return typeConfiguration;
301-
}
302-
303295
@Override
304296
public AttributeMapping asAttributeMapping() {
305297
return getAttribute();

hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
*
3232
* @author Steve Ebersole
3333
*/
34-
public class QueryParameterBindingImpl<T> implements QueryParameterBinding<T>, JavaType.CoercionContext {
34+
public class QueryParameterBindingImpl<T> implements QueryParameterBinding<T> {
3535
private final QueryParameter<T> queryParameter;
3636
private final SessionFactoryImplementor sessionFactory;
3737

@@ -296,7 +296,6 @@ private void validate(Object value, TemporalType clarifiedTemporalType) {
296296
QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, clarifiedTemporalType, getCriteriaBuilder() );
297297
}
298298

299-
@Override
300299
public TypeConfiguration getTypeConfiguration() {
301300
return sessionFactory.getTypeConfiguration();
302301
}
@@ -337,7 +336,7 @@ private Object coerce(T value, BindableType<? super T> parameterType) {
337336
}
338337
else {
339338
return getCriteriaBuilder().resolveExpressible( parameterType )
340-
.getExpressibleJavaType().coerce( value, this );
339+
.getExpressibleJavaType().coerce( value );
341340
}
342341
}
343342

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5812,8 +5812,7 @@ else if ( Character.class.isAssignableFrom( valueConverter.getRelationalJavaType
58125812
// so we allow coercion between the number types
58135813
else if ( Number.class.isAssignableFrom( valueConverter.getRelationalJavaType().getJavaTypeClass() )
58145814
&& value instanceof Number ) {
5815-
return valueConverter.getRelationalJavaType()
5816-
.coerce( value );
5815+
return valueConverter.getRelationalJavaType().coerce( value );
58175816
}
58185817
else {
58195818
throw new SemanticException(

hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/CoercingResultAssembler.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ public CoercingResultAssembler(
2929
*/
3030
@Override
3131
public Object extractRawValue(RowProcessingState rowProcessingState) {
32-
return assembledJavaType.coerce(
33-
super.extractRawValue( rowProcessingState ),
34-
rowProcessingState.getSession()
35-
);
32+
return assembledJavaType.coerce( super.extractRawValue( rowProcessingState ) );
3633
}
3734
}

hibernate-core/src/main/java/org/hibernate/type/AbstractStandardBasicType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ public final String toLoggableString(Object value, SessionFactoryImplementor fac
258258
|| !Hibernate.isInitialized( value )
259259
? "<uninitialized>"
260260
: javaType.extractLoggableRepresentation(
261-
javaType.coerce( value, factory::getTypeConfiguration ) );
261+
javaType.cast( javaType.coerce( value ) ) );
262262
}
263263

264264
@Override

0 commit comments

Comments
 (0)