Skip to content

Commit d05f048

Browse files
committed
deprecate the unsafe methods of JpaMetamodel
and fix unchecked casts in the impl
1 parent b2ed4c5 commit d05f048

File tree

7 files changed

+64
-31
lines changed

7 files changed

+64
-31
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/JpaMetamodel.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ public interface JpaMetamodel extends Metamodel {
3333

3434
/**
3535
* Access to a managed type through its name
36+
*
37+
* @deprecated This method performs an unchecked type cast
3638
*/
39+
@Deprecated(since = "7.2")
3740
<X> ManagedDomainType<X> managedType(String typeName);
3841

3942
/**
@@ -49,13 +52,19 @@ public interface JpaMetamodel extends Metamodel {
4952
/**
5053
* Specialized handling for resolving entity-name references in
5154
* an HQL query
55+
*
56+
* @deprecated This method performs an unchecked type cast
5257
*/
58+
@Deprecated(since = "7.2")
5359
<X> EntityDomainType<X> getHqlEntityReference(String entityName);
5460

5561
/**
5662
* Specialized handling for resolving entity-name references in
5763
* an HQL query
64+
*
65+
* @deprecated This method performs an unchecked type cast
5866
*/
67+
@Deprecated(since = "7.2")
5968
<X> EntityDomainType<X> resolveHqlEntityReference(String entityName);
6069

6170
/**
@@ -79,7 +88,10 @@ public interface JpaMetamodel extends Metamodel {
7988
/**
8089
* Same as {@link #managedType(String)} except {@code null} is returned rather
8190
* than throwing an exception
91+
*
92+
* @deprecated This method performs an unchecked type cast
8293
*/
94+
@Deprecated(since = "7.2")
8395
@Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName);
8496

8597
/**

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.HashSet;
1515
import java.util.List;
1616
import java.util.Map;
17+
import java.util.Objects;
1718
import java.util.Set;
1819
import java.util.TreeMap;
1920
import java.util.concurrent.ConcurrentHashMap;
@@ -115,7 +116,7 @@ public ServiceRegistry getServiceRegistry() {
115116
return serviceRegistry;
116117
}
117118

118-
@Override
119+
@Override @Deprecated
119120
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
120121
//noinspection unchecked
121122
return typeName == null ? null : (ManagedDomainType<X>) managedTypeByName.get( typeName );
@@ -192,9 +193,10 @@ public EmbeddableDomainType<?> embeddable(String embeddableName) {
192193
return embeddableType;
193194
}
194195

195-
@Override
196+
@Override @Deprecated
196197
public <X> EntityDomainType<X> getHqlEntityReference(String entityName) {
197198
Class<X> loadedClass = null;
199+
//noinspection unchecked
198200
final var importInfo = (ImportInfo<X>) resolveImport( entityName );
199201
if ( importInfo != null ) {
200202
loadedClass = importInfo.loadedClass;
@@ -208,6 +210,7 @@ public <X> EntityDomainType<X> getHqlEntityReference(String entityName) {
208210
}
209211

210212
if ( loadedClass == null ) {
213+
//noinspection unchecked
211214
loadedClass = (Class<X>) resolveRequestedClass( entityName );
212215
// populate the class cache for boot metamodel imports
213216
if ( importInfo != null && loadedClass != null ) {
@@ -220,7 +223,7 @@ public <X> EntityDomainType<X> getHqlEntityReference(String entityName) {
220223
return null;
221224
}
222225

223-
@Override
226+
@Override @Deprecated
224227
public <X> EntityDomainType<X> resolveHqlEntityReference(String entityName) {
225228
final EntityDomainType<X> hqlEntityReference = getHqlEntityReference( entityName );
226229
if ( hqlEntityReference == null ) {
@@ -229,11 +232,22 @@ public <X> EntityDomainType<X> resolveHqlEntityReference(String entityName) {
229232
return hqlEntityReference;
230233
}
231234

235+
private static <X> ManagedDomainType<X> checkDomainType(Class<X> cls, ManagedDomainType<?> domainType) {
236+
if ( domainType != null && !Objects.equals( domainType.getJavaType(), cls ) ) {
237+
throw new IllegalStateException( "Managed type " + domainType
238+
+ " has a different Java type than requested" );
239+
}
240+
else {
241+
@SuppressWarnings("unchecked") // Safe, we checked it
242+
final var type = (ManagedDomainType<X>) domainType;
243+
return type;
244+
}
245+
}
246+
232247
@Override
233248
@Nullable
234249
public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
235-
//noinspection unchecked
236-
return (ManagedDomainType<X>) managedTypeByClass.get( cls );
250+
return checkDomainType( cls, managedTypeByClass.get( cls ) );
237251
}
238252

239253
@Override
@@ -249,10 +263,9 @@ public <X> ManagedDomainType<X> managedType(Class<X> cls) {
249263
@Override
250264
@Nullable
251265
public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
252-
final var type = managedTypeByClass.get( cls );
253-
//noinspection unchecked
254-
return type instanceof EntityDomainType<?>
255-
? (EntityDomainType<X>) type
266+
return checkDomainType( cls, managedTypeByClass.get( cls ) )
267+
instanceof EntityDomainType<X> entityDomainType
268+
? entityDomainType
256269
: null;
257270
}
258271

@@ -267,10 +280,9 @@ public <X> EntityDomainType<X> entity(Class<X> cls) {
267280

268281
@Override
269282
public @Nullable <X> EmbeddableDomainType<X> findEmbeddableType(Class<X> cls) {
270-
final var type = managedTypeByClass.get( cls );
271-
//noinspection unchecked
272-
return type instanceof EmbeddableDomainType<?>
273-
? (EmbeddableDomainType<X>) type
283+
return checkDomainType( cls, managedTypeByClass.get( cls ) )
284+
instanceof EmbeddableDomainType<X> embeddableDomainType
285+
? embeddableDomainType
274286
: null;
275287
}
276288

@@ -740,17 +752,20 @@ private <J> EntityTypeImpl<J> entityType(
740752
final var supertype =
741753
(IdentifiableDomainType<? super J>)
742754
supertypeForPersistentClass( persistentClass, context, typeConfiguration );
743-
final JavaType<J> javaType;
755+
return new EntityTypeImpl<>( entityJavaType( mappedClass, context ),
756+
supertype, persistentClass, this );
757+
}
758+
759+
private static <J> JavaType<J> entityJavaType(Class<J> mappedClass, MetadataContext context) {
744760
if ( mappedClass == null || Map.class.isAssignableFrom( mappedClass ) ) {
745761
// dynamic map
746762
//noinspection unchecked
747-
javaType = (JavaType<J>) new DynamicModelJavaType();
763+
return (JavaType<J>) new DynamicModelJavaType();
748764
}
749765
else {
750-
javaType = context.getTypeConfiguration().getJavaTypeRegistry()
766+
return context.getTypeConfiguration().getJavaTypeRegistry()
751767
.resolveEntityTypeDescriptor( mappedClass );
752768
}
753-
return new EntityTypeImpl<>( javaType, supertype, persistentClass, this );
754769
}
755770

756771
private void handleUnusedMappedSuperclasses(MetadataContext context, TypeConfiguration typeConfiguration) {

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -418,12 +418,12 @@ public Set<EmbeddableType<?>> getEmbeddables() {
418418
return jpaMetamodel.getEmbeddables();
419419
}
420420

421-
@Override
421+
@Override @Deprecated
422422
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
423423
return jpaMetamodel.findManagedType( typeName );
424424
}
425425

426-
@Override
426+
@Override @Deprecated
427427
public <X> ManagedDomainType<X> managedType(String typeName) {
428428
return jpaMetamodel.managedType( typeName );
429429
}
@@ -448,12 +448,12 @@ public EmbeddableDomainType<?> embeddable(String embeddableName) {
448448
return jpaMetamodel.embeddable( embeddableName );
449449
}
450450

451-
@Override
451+
@Override @Deprecated
452452
public <X> EntityDomainType<X> getHqlEntityReference(String entityName) {
453453
return jpaMetamodel.getHqlEntityReference( entityName );
454454
}
455455

456-
@Override
456+
@Override @Deprecated
457457
public <X> EntityDomainType<X> resolveHqlEntityReference(String entityName) {
458458
return jpaMetamodel.resolveHqlEntityReference( entityName );
459459
}

hibernate-core/src/main/java/org/hibernate/query/hql/internal/BasicDotIdentifierConsumer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public void consumeTreat(String importableName, boolean isTerminal) {
9999
private <T> Class<T> treatTarget(String typeName) {
100100
final ManagedDomainType<T> managedType =
101101
creationState.getCreationContext().getJpaMetamodel()
102+
// TODO: don't use this unsafe, deprecated method
102103
.managedType( typeName );
103104
return managedType.getJavaType();
104105
}

hibernate-core/src/main/java/org/hibernate/query/hql/internal/QualifiedJoinPathConsumer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,11 @@ public void consumeTreat(String typeName, boolean isTerminal) {
308308
}
309309

310310
private <T> Class<T> treatTarget(String typeName) {
311-
final ManagedDomainType<T> managedType = creationState.getCreationContext()
312-
.getJpaMetamodel()
313-
.managedType( typeName );
311+
final ManagedDomainType<T> managedType =
312+
creationState.getCreationContext()
313+
.getJpaMetamodel()
314+
// TODO: don't use this unsafe, deprecated method
315+
.managedType( typeName );
314316
return managedType.getJavaType();
315317
}
316318

hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2138,9 +2138,8 @@ public final SqmCrossJoin<?> visitCrossJoin(HqlParser.CrossJoinContext ctx) {
21382138
protected <T> void consumeCrossJoin(HqlParser.CrossJoinContext parserJoin, SqmRoot<T> sqmRoot) {
21392139
final String name = getEntityName( parserJoin.entityName() );
21402140

2141-
// SqmTreeCreationLogger.LOGGER.tracef( "Handling root path - %s", name );
2142-
2143-
final var entityDescriptor = getJpaMetamodel().resolveHqlEntityReference( name );
2141+
final EntityDomainType<?> entityDescriptor =
2142+
getJpaMetamodel().resolveHqlEntityReference( name );
21442143

21452144
if ( entityDescriptor instanceof SqmPolymorphicRootDescriptor ) {
21462145
throw new SemanticException( "Unmapped polymorphic reference cannot be used as a target of 'cross join'",
@@ -2579,8 +2578,8 @@ else if ( r instanceof AnyDiscriminatorSqmPath<?> anyDiscriminatorPath && l inst
25792578
);
25802579
}
25812580

2582-
private <T> SqmExpression<T> createDiscriminatorValue(
2583-
AnyDiscriminatorSqmPath<T> anyDiscriminatorTypeSqmPath,
2581+
private SqmExpression<?> createDiscriminatorValue(
2582+
AnyDiscriminatorSqmPath<?> anyDiscriminatorTypeSqmPath,
25842583
HqlParser.ExpressionContext valueExpressionContext) {
25852584
final var expressible = anyDiscriminatorTypeSqmPath.getExpressible();
25862585
return new SqmAnyDiscriminatorValue<>(

hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableFetchImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
1212
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
1313
import org.hibernate.metamodel.model.domain.JpaMetamodel;
14+
import org.hibernate.metamodel.model.domain.ManagedDomainType;
1415
import org.hibernate.spi.NavigablePath;
1516
import org.hibernate.sql.ast.SqlAstJoinType;
1617
import org.hibernate.sql.ast.tree.expression.Expression;
@@ -195,8 +196,11 @@ public EmbeddableInitializer<?> createInitializer(InitializerParent<?> parent, A
195196

196197
@Override
197198
public boolean appliesTo(GraphImplementor<?> graphImplementor, JpaMetamodel metamodel) {
198-
// We use managedType here since this fetch could correspond to an entity type if the embeddable is an id-class
199-
return GraphHelper.appliesTo( graphImplementor, metamodel.managedType( getResultJavaType().getTypeName() ) );
199+
// We use managedType here since this fetch could correspond
200+
// to an entity type if the embeddable is an @IdClass
201+
final ManagedDomainType<?> managedType =
202+
metamodel.managedType( getResultJavaType().getTypeName() );
203+
return GraphHelper.appliesTo( graphImplementor, managedType );
200204
}
201205

202206
@Override

0 commit comments

Comments
 (0)