Skip to content

Commit 64f05ee

Browse files
mbelladecigaly
authored andcommitted
HHH-18683 Change metamodel implementations to comply with JPA spec
1 parent 35c7df3 commit 64f05ee

File tree

7 files changed

+140
-42
lines changed

7 files changed

+140
-42
lines changed

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

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,40 @@ public interface JpaMetamodel extends Metamodel {
7777
<X> EntityDomainType<X> resolveHqlEntityReference(String entityName);
7878

7979
/**
80-
* Same as {@link #managedType} except {@code null} is returned rather
80+
* Same as {@link #managedType(Class)} except {@code null} is returned rather
8181
* than throwing an exception
8282
*/
83-
<X> ManagedDomainType<X> findManagedType(Class<X> cls);
83+
@Nullable <X> ManagedDomainType<X> findManagedType(Class<X> cls);
8484

8585
/**
86-
* Same as {@link #entity} except {@code null} is returned rather
86+
* Same as {@link #entity(Class)} except {@code null} is returned rather
8787
* than throwing an exception
8888
*/
89-
<X> EntityDomainType<X> findEntityType(Class<X> cls);
89+
@Nullable <X> EntityDomainType<X> findEntityType(Class<X> cls);
90+
91+
/**
92+
* Same as {@link #embeddable(Class)} except {@code null} is returned rather
93+
* than throwing an exception
94+
*/
95+
@Nullable <X> EmbeddableDomainType<X> findEmbeddableType(Class<X> cls);
96+
97+
/**
98+
* Same as {@link #managedType(String)} except {@code null} is returned rather
99+
* than throwing an exception
100+
*/
101+
@Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName);
102+
103+
/**
104+
* Same as {@link #entity(String)} except {@code null} is returned rather
105+
* than throwing an exception
106+
*/
107+
@Nullable EntityDomainType<?> findEntityType(@Nullable String entityName);
108+
109+
/**
110+
* Same as {@link #embeddable(String)} except {@code null} is returned rather
111+
* than throwing an exception
112+
*/
113+
@Nullable EmbeddableDomainType<?> findEmbeddableType(@Nullable String embeddableName);
90114

91115
String qualifyImportableName(String queryName);
92116

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

Lines changed: 63 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -132,35 +132,62 @@ public JpaCompliance getJpaCompliance() {
132132
}
133133

134134
@Override
135-
public <X> ManagedDomainType<X> managedType(String typeName) {
135+
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
136136
//noinspection unchecked
137137
return typeName == null ? null : (ManagedDomainType<X>) managedTypeByName.get( typeName );
138138
}
139139

140140
@Override
141-
public <X> EntityDomainType<X> entity(String entityName) {
141+
public <X> ManagedDomainType<X> managedType(String typeName) {
142+
final ManagedDomainType<X> managedType = findManagedType( typeName );
143+
if ( managedType == null ) {
144+
throw new IllegalArgumentException("Not a managed type: " + typeName);
145+
}
146+
return managedType;
147+
}
148+
149+
@Override
150+
@Nullable public EntityDomainType<?> findEntityType(@Nullable String entityName) {
142151
if ( entityName == null ) {
143152
return null;
144153
}
145154
final ManagedDomainType<?> managedType = managedTypeByName.get( entityName );
146-
if ( !( managedType instanceof EntityDomainType<?> ) ) {
155+
if ( !(managedType instanceof EntityDomainType<?>) ) {
147156
return null;
148157
}
149158
//noinspection unchecked
150-
return (EntityDomainType<X>) managedType;
159+
return (EntityDomainType<?>) managedType;
151160
}
152161

153162
@Override
154-
public <X> EmbeddableDomainType<X> embeddable(String embeddableName) {
163+
public <X> EntityDomainType<X> entity(String entityName) {
164+
final EntityDomainType<?> entityType = findEntityType( entityName );
165+
if ( entityType == null ) {
166+
// per JPA
167+
throw new IllegalArgumentException("Not an entity: " + entityName);
168+
}
169+
return (EntityDomainType<X>) entityType;
170+
}
171+
172+
@Override
173+
@Nullable public EmbeddableDomainType<?> findEmbeddableType(@Nullable String embeddableName) {
155174
if ( embeddableName == null ) {
156175
return null;
157176
}
158177
final ManagedDomainType<?> managedType = managedTypeByName.get( embeddableName );
159-
if ( !( managedType instanceof EmbeddableDomainType<?> ) ) {
178+
if ( !(managedType instanceof EmbeddableDomainType<?>) ) {
160179
return null;
161180
}
162-
//noinspection unchecked
163-
return (EmbeddableDomainType<X>) managedType;
181+
return (EmbeddableDomainType<?>) managedType;
182+
}
183+
184+
@Override
185+
public <X> EmbeddableDomainType<X> embeddable(String embeddableName) {
186+
final EmbeddableDomainType<?> embeddableType = findEmbeddableType( embeddableName );
187+
if ( embeddableType == null ) {
188+
throw new IllegalArgumentException("Not an embeddable: " + embeddableName);
189+
}
190+
return (EmbeddableDomainType<X>) embeddableType;
164191
}
165192

166193
@Override
@@ -172,9 +199,9 @@ public <X> EntityDomainType<X> getHqlEntityReference(String entityName) {
172199
entityName = importInfo.importedName;
173200
}
174201

175-
final EntityDomainType<X> entityDescriptor = entity( entityName );
202+
final EntityDomainType<?> entityDescriptor = findEntityType( entityName );
176203
if ( entityDescriptor != null ) {
177-
return entityDescriptor;
204+
return (EntityDomainType<X>) entityDescriptor;
178205
}
179206

180207
if ( loadedClass == null ) {
@@ -200,13 +227,23 @@ public <X> EntityDomainType<X> resolveHqlEntityReference(String entityName) {
200227
}
201228

202229
@Override
203-
public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
230+
@Nullable public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
204231
//noinspection unchecked
205232
return (ManagedDomainType<X>) managedTypeByClass.get( cls );
206233
}
207234

208235
@Override
209-
public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
236+
public <X> ManagedDomainType<X> managedType(Class<X> cls) {
237+
final ManagedDomainType<X> type = findManagedType( cls );
238+
if ( type == null ) {
239+
// per JPA
240+
throw new IllegalArgumentException( "Not a managed type: " + cls );
241+
}
242+
return type;
243+
}
244+
245+
@Override
246+
@Nullable public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
210247
final ManagedType<?> type = managedTypeByClass.get( cls );
211248
if ( !( type instanceof EntityDomainType<?> ) ) {
212249
return null;
@@ -216,35 +253,31 @@ public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
216253
}
217254

218255
@Override
219-
public <X> ManagedDomainType<X> managedType(Class<X> cls) {
220-
final ManagedType<?> type = managedTypeByClass.get( cls );
221-
if ( type == null ) {
222-
// per JPA
223-
throw new IllegalArgumentException( "Not a managed type: " + cls );
256+
public <X> EntityDomainType<X> entity(Class<X> cls) {
257+
final EntityDomainType<X> entityType = findEntityType( cls );
258+
if ( entityType == null ) {
259+
throw new IllegalArgumentException( "Not an entity: " + cls.getName() );
224260
}
225-
226-
//noinspection unchecked
227-
return (ManagedDomainType<X>) type;
261+
return entityType;
228262
}
229263

230264
@Override
231-
public <X> EntityDomainType<X> entity(Class<X> cls) {
265+
public @Nullable <X> EmbeddableDomainType<X> findEmbeddableType(Class<X> cls) {
232266
final ManagedType<?> type = managedTypeByClass.get( cls );
233-
if ( !( type instanceof EntityDomainType<?> ) ) {
234-
throw new IllegalArgumentException( "Not an entity: " + cls.getName() );
267+
if ( !( type instanceof EmbeddableDomainType<?> ) ) {
268+
return null;
235269
}
236270
//noinspection unchecked
237-
return (EntityDomainType<X>) type;
271+
return (EmbeddableDomainType<X>) type;
238272
}
239273

240274
@Override
241275
public <X> EmbeddableDomainType<X> embeddable(Class<X> cls) {
242-
final ManagedType<?> type = managedTypeByClass.get( cls );
243-
if ( !( type instanceof EmbeddableDomainType<?> ) ) {
276+
final EmbeddableDomainType<X> embeddableType = findEmbeddableType( cls );
277+
if ( embeddableType == null ) {
244278
throw new IllegalArgumentException( "Not an embeddable: " + cls.getName() );
245279
}
246-
//noinspection unchecked
247-
return (EmbeddableDomainType<X>) type;
280+
return embeddableType;
248281
}
249282

250283
private Collection<ManagedDomainType<?>> getAllManagedTypes() {
@@ -428,7 +461,7 @@ private void applyNamedEntityGraphs(Collection<NamedEntityGraphDefinition> named
428461
definition.getEntityName(),
429462
definition.getJpaEntityName()
430463
);
431-
final EntityDomainType<Object> entityType = entity( definition.getEntityName() );
464+
final EntityDomainType<Object> entityType = (EntityDomainType<Object>) findEntityType( definition.getEntityName() );
432465
if ( entityType == null ) {
433466
throw new IllegalArgumentException(
434467
"Attempted to register named entity graph [" + definition.getRegisteredName()
@@ -442,7 +475,7 @@ private void applyNamedEntityGraphs(Collection<NamedEntityGraphDefinition> named
442475
final NamedEntityGraph namedEntityGraph = definition.getAnnotation();
443476

444477
if ( namedEntityGraph.includeAllAttributes() ) {
445-
for ( Attribute<? super Object, ?> attribute : entityType.getAttributes() ) {
478+
for ( Attribute<Object, ?> attribute : entityType.getAttributes() ) {
446479
entityGraph.addAttributeNodes( attribute );
447480
}
448481
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.function.Function;
2020
import java.util.stream.Stream;
2121

22+
import org.checkerframework.checker.nullness.qual.Nullable;
2223
import org.hibernate.EntityNameResolver;
2324
import org.hibernate.HibernateException;
2425
import org.hibernate.MappingException;
@@ -490,16 +491,31 @@ public Set<EmbeddableType<?>> getEmbeddables() {
490491
return jpaMetamodel.getEmbeddables();
491492
}
492493

494+
@Override
495+
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
496+
return jpaMetamodel.findManagedType( typeName );
497+
}
498+
493499
@Override
494500
public <X> ManagedDomainType<X> managedType(String typeName) {
495501
return jpaMetamodel.managedType( typeName );
496502
}
497503

504+
@Override
505+
public @Nullable EntityDomainType<?> findEntityType(@Nullable String entityName) {
506+
return jpaMetamodel.findEntityType( entityName );
507+
}
508+
498509
@Override
499510
public <X> EntityDomainType<X> entity(String entityName) {
500511
return jpaMetamodel.entity( entityName );
501512
}
502513

514+
@Override
515+
public @Nullable EmbeddableDomainType<?> findEmbeddableType(@Nullable String embeddableName) {
516+
return jpaMetamodel.findEmbeddableType( embeddableName );
517+
}
518+
503519
@Override
504520
public <X> EmbeddableDomainType<X> embeddable(String embeddableName) {
505521
return jpaMetamodel.embeddable( embeddableName );
@@ -525,6 +541,11 @@ public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
525541
return jpaMetamodel.findEntityType( cls );
526542
}
527543

544+
@Override
545+
public @Nullable <X> EmbeddableDomainType<X> findEmbeddableType(Class<X> cls) {
546+
return jpaMetamodel.findEmbeddableType( cls );
547+
}
548+
528549
@Override
529550
public String qualifyImportableName(String queryName) {
530551
return jpaMetamodel.qualifyImportableName( queryName );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public FullyQualifiedReflectivePathTerminal copy(SqmCopyContext context) {
7575
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7676
// See if it is an entity-type literal
7777

78-
final EntityDomainType<?> entityDescriptor = creationContext.getJpaMetamodel().entity( fullPath );
78+
final EntityDomainType<?> entityDescriptor = creationContext.getJpaMetamodel().findEntityType( fullPath );
7979
if ( entityDescriptor != null ) {
8080
return new SqmLiteralEntityType<>( entityDescriptor, creationContext.getNodeBuilder() );
8181
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,12 +1298,13 @@ private SqmFromClause buildInferredFromClause(HqlParser.SelectClauseContext sele
12981298
private EntityDomainType<R> getResultEntity() {
12991299
final JpaMetamodelImplementor jpaMetamodel = creationContext.getJpaMetamodel();
13001300
if ( expectedResultEntity != null ) {
1301-
final EntityDomainType<R> entityDescriptor = jpaMetamodel.entity( expectedResultEntity );
1301+
final EntityDomainType<?> entityDescriptor = jpaMetamodel.findEntityType( expectedResultEntity );
13021302
if ( entityDescriptor == null ) {
13031303
throw new SemanticException( "Query has no 'from' clause, and the result type '"
13041304
+ expectedResultEntity + "' is not an entity type", query );
13051305
}
1306-
return entityDescriptor;
1306+
//noinspection unchecked
1307+
return (EntityDomainType<R>) entityDescriptor;
13071308
}
13081309
else if ( expectedResultType != null ) {
13091310
final EntityDomainType<R> entityDescriptor = jpaMetamodel.findEntityType( expectedResultType );

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
@@ -3084,9 +3084,8 @@ private void registerEntityNameUsage(
30843084
if ( tableGroup.getModelPart() instanceof EmbeddableValuedModelPart ) {
30853085
persister = null;
30863086
final EmbeddableDomainType<?> embeddableDomainType = creationContext.getSessionFactory()
3087-
.getRuntimeMetamodels()
30883087
.getJpaMetamodel()
3089-
.embeddable( treatTargetTypeName );
3088+
.findEmbeddableType( treatTargetTypeName );
30903089
if ( embeddableDomainType == null || !embeddableDomainType.isPolymorphic() ) {
30913090
return;
30923091
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -816,9 +816,13 @@ public <X> EntityDomainType<X> entity(String entityName) {
816816
}
817817

818818
@Override
819-
public <X> ManagedDomainType<X> managedType(String typeName) {
820-
final String entityName = findEntityName( typeName );
821-
return entityName == null ? null : entity( entityName );
819+
public @Nullable EntityDomainType<?> findEntityType(@Nullable String entityName) {
820+
if ( isEntityDefined(entityName) ) {
821+
return new MockEntityDomainType<>(entityName);
822+
}
823+
else {
824+
return null;
825+
}
822826
}
823827

824828
@Override
@@ -832,6 +836,22 @@ else if (isEntityDefined(queryName)) {
832836
return null;
833837
}
834838

839+
@Override
840+
public <X> ManagedDomainType<X> managedType(String typeName) {
841+
final ManagedDomainType<X> managedType = findManagedType( typeName );
842+
if ( managedType == null ) {
843+
throw new IllegalArgumentException("Not a managed type: " + typeName);
844+
}
845+
return managedType;
846+
}
847+
848+
@Override
849+
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
850+
final String entityName = qualifyName( typeName );
851+
//noinspection unchecked
852+
return entityName == null ? null : (ManagedDomainType<X>) findEntityType( entityName );
853+
}
854+
835855
@Override
836856
public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
837857
throw new UnsupportedOperationException("operation not supported");

0 commit comments

Comments
 (0)