Skip to content

Commit 8dca863

Browse files
mbelladesebersole
authored andcommitted
HHH-18683 Change metamodel implementations to comply with JPA spec
1 parent a4233cf commit 8dca863

File tree

7 files changed

+134
-36
lines changed

7 files changed

+134
-36
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
@@ -78,16 +78,40 @@ public interface JpaMetamodel extends Metamodel {
7878
<X> EntityDomainType<X> resolveHqlEntityReference(String entityName);
7979

8080
/**
81-
* Same as {@link #managedType} except {@code null} is returned rather
81+
* Same as {@link #managedType(Class)} except {@code null} is returned rather
8282
* than throwing an exception
8383
*/
84-
<X> ManagedDomainType<X> findManagedType(Class<X> cls);
84+
@Nullable <X> ManagedDomainType<X> findManagedType(Class<X> cls);
8585

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

92116
String qualifyImportableName(String queryName);
93117

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

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -134,33 +134,61 @@ public JpaCompliance getJpaCompliance() {
134134
}
135135

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

142142
@Override
143-
public EntityDomainType<?> entity(String entityName) {
143+
public <X> ManagedDomainType<X> managedType(String typeName) {
144+
final ManagedDomainType<X> managedType = findManagedType( typeName );
145+
if ( managedType == null ) {
146+
throw new IllegalArgumentException("Not a managed type: " + typeName);
147+
}
148+
return managedType;
149+
}
150+
151+
@Override
152+
@Nullable public EntityDomainType<?> findEntityType(@Nullable String entityName) {
144153
if ( entityName == null ) {
145154
return null;
146155
}
147156
final ManagedDomainType<?> managedType = managedTypeByName.get( entityName );
148-
if ( !( managedType instanceof EntityDomainType<?> ) ) {
157+
if ( !( managedType instanceof EntityDomainType<?> entityDomainType ) ) {
149158
return null;
150159
}
151-
return (EntityDomainType<?>) managedType;
160+
return entityDomainType;
152161
}
153162

154163
@Override
155-
public EmbeddableDomainType<?> embeddable(String embeddableName) {
164+
public EntityDomainType<?> entity(String entityName) {
165+
final EntityDomainType<?> entityType = findEntityType( entityName );
166+
if ( entityType == null ) {
167+
// per JPA
168+
throw new IllegalArgumentException("Not an entity: " + entityName);
169+
}
170+
return entityType;
171+
}
172+
173+
@Override
174+
@Nullable public EmbeddableDomainType<?> findEmbeddableType(@Nullable String embeddableName) {
156175
if ( embeddableName == null ) {
157176
return null;
158177
}
159178
final ManagedDomainType<?> managedType = managedTypeByName.get( embeddableName );
160-
if ( !( managedType instanceof EmbeddableDomainType<?> ) ) {
179+
if ( !( managedType instanceof EmbeddableDomainType<?> embeddableDomainType) ) {
161180
return null;
162181
}
163-
return (EmbeddableDomainType<?>) managedType;
182+
return embeddableDomainType;
183+
}
184+
185+
@Override
186+
public EmbeddableDomainType<?> embeddable(String embeddableName) {
187+
final EmbeddableDomainType<?> embeddableType = findEmbeddableType( embeddableName );
188+
if ( embeddableType == null ) {
189+
throw new IllegalArgumentException("Not an embeddable: " + embeddableName);
190+
}
191+
return embeddableType;
164192
}
165193

166194
@Override
@@ -172,7 +200,7 @@ public <X> EntityDomainType<X> getHqlEntityReference(String entityName) {
172200
entityName = importInfo.importedName;
173201
}
174202

175-
final EntityDomainType<?> entityDescriptor = entity( entityName );
203+
final EntityDomainType<?> entityDescriptor = findEntityType( entityName );
176204
if ( entityDescriptor != null ) {
177205
//noinspection unchecked
178206
return (EntityDomainType<X>) entityDescriptor;
@@ -201,13 +229,23 @@ public <X> EntityDomainType<X> resolveHqlEntityReference(String entityName) {
201229
}
202230

203231
@Override
204-
public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
232+
@Nullable public <X> ManagedDomainType<X> findManagedType(Class<X> cls) {
205233
//noinspection unchecked
206234
return (ManagedDomainType<X>) managedTypeByClass.get( cls );
207235
}
208236

209237
@Override
210-
public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
238+
public <X> ManagedDomainType<X> managedType(Class<X> cls) {
239+
final ManagedDomainType<X> type = findManagedType( cls );
240+
if ( type == null ) {
241+
// per JPA
242+
throw new IllegalArgumentException( "Not a managed type: " + cls );
243+
}
244+
return type;
245+
}
246+
247+
@Override
248+
@Nullable public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
211249
final ManagedType<?> type = managedTypeByClass.get( cls );
212250
if ( !( type instanceof EntityDomainType<?> ) ) {
213251
return null;
@@ -217,35 +255,31 @@ public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
217255
}
218256

219257
@Override
220-
public <X> ManagedDomainType<X> managedType(Class<X> cls) {
221-
final ManagedType<?> type = managedTypeByClass.get( cls );
222-
if ( type == null ) {
223-
// per JPA
224-
throw new IllegalArgumentException( "Not a managed type: " + cls );
258+
public <X> EntityDomainType<X> entity(Class<X> cls) {
259+
final EntityDomainType<X> entityType = findEntityType( cls );
260+
if ( entityType == null ) {
261+
throw new IllegalArgumentException( "Not an entity: " + cls.getName() );
225262
}
226-
227-
//noinspection unchecked
228-
return (ManagedDomainType<X>) type;
263+
return entityType;
229264
}
230265

231266
@Override
232-
public <X> EntityDomainType<X> entity(Class<X> cls) {
267+
public @Nullable <X> EmbeddableDomainType<X> findEmbeddableType(Class<X> cls) {
233268
final ManagedType<?> type = managedTypeByClass.get( cls );
234-
if ( !( type instanceof EntityDomainType<?> ) ) {
235-
throw new IllegalArgumentException( "Not an entity: " + cls.getName() );
269+
if ( !( type instanceof EmbeddableDomainType<?> ) ) {
270+
return null;
236271
}
237272
//noinspection unchecked
238-
return (EntityDomainType<X>) type;
273+
return (EmbeddableDomainType<X>) type;
239274
}
240275

241276
@Override
242277
public <X> EmbeddableDomainType<X> embeddable(Class<X> cls) {
243-
final ManagedType<?> type = managedTypeByClass.get( cls );
244-
if ( !( type instanceof EmbeddableDomainType<?> ) ) {
278+
final EmbeddableDomainType<X> embeddableType = findEmbeddableType( cls );
279+
if ( embeddableType == null ) {
245280
throw new IllegalArgumentException( "Not an embeddable: " + cls.getName() );
246281
}
247-
//noinspection unchecked
248-
return (EmbeddableDomainType<X>) type;
282+
return embeddableType;
249283
}
250284

251285
private Collection<ManagedDomainType<?>> getAllManagedTypes() {
@@ -441,7 +475,7 @@ private void applyNamedEntityGraphs(Collection<NamedEntityGraphDefinition> named
441475
definition.getEntityName(),
442476
definition.getJpaEntityName()
443477
);
444-
final EntityDomainType<?> entityType = entity( definition.getEntityName() );
478+
final EntityDomainType<?> entityType = findEntityType( definition.getEntityName() );
445479
if ( entityType == null ) {
446480
throw new IllegalArgumentException(
447481
"Attempted to register named entity graph [" + definition.getRegisteredName()

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
@@ -17,6 +17,7 @@
1717
import java.util.function.Function;
1818
import java.util.stream.Stream;
1919

20+
import org.checkerframework.checker.nullness.qual.Nullable;
2021
import org.hibernate.EntityNameResolver;
2122
import org.hibernate.HibernateException;
2223
import org.hibernate.MappingException;
@@ -459,16 +460,31 @@ public Set<EmbeddableType<?>> getEmbeddables() {
459460
return jpaMetamodel.getEmbeddables();
460461
}
461462

463+
@Override
464+
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
465+
return jpaMetamodel.findManagedType( typeName );
466+
}
467+
462468
@Override
463469
public <X> ManagedDomainType<X> managedType(String typeName) {
464470
return jpaMetamodel.managedType( typeName );
465471
}
466472

473+
@Override
474+
public @Nullable EntityDomainType<?> findEntityType(@Nullable String entityName) {
475+
return jpaMetamodel.findEntityType( entityName );
476+
}
477+
467478
@Override
468479
public EntityDomainType<?> entity(String entityName) {
469480
return jpaMetamodel.entity( entityName );
470481
}
471482

483+
@Override
484+
public @Nullable EmbeddableDomainType<?> findEmbeddableType(@Nullable String embeddableName) {
485+
return jpaMetamodel.findEmbeddableType( embeddableName );
486+
}
487+
472488
@Override
473489
public EmbeddableDomainType<?> embeddable(String embeddableName) {
474490
return jpaMetamodel.embeddable( embeddableName );
@@ -494,6 +510,11 @@ public <X> EntityDomainType<X> findEntityType(Class<X> cls) {
494510
return jpaMetamodel.findEntityType( cls );
495511
}
496512

513+
@Override
514+
public @Nullable <X> EmbeddableDomainType<X> findEmbeddableType(Class<X> cls) {
515+
return jpaMetamodel.findEmbeddableType( cls );
516+
}
517+
497518
@Override
498519
public String qualifyImportableName(String queryName) {
499520
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
@@ -71,7 +71,7 @@ public FullyQualifiedReflectivePathTerminal<E> copy(SqmCopyContext context) {
7171
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7272
// See if it is an entity-type literal
7373

74-
final EntityDomainType<?> entityDescriptor = creationContext.getJpaMetamodel().entity( fullPath );
74+
final EntityDomainType<?> entityDescriptor = creationContext.getJpaMetamodel().findEntityType( fullPath );
7575
if ( entityDescriptor != null ) {
7676
return new SqmLiteralEntityType<>( entityDescriptor, creationContext.getNodeBuilder() );
7777
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,11 +1242,12 @@ private SqmFromClause buildInferredFromClause(HqlParser.SelectClauseContext sele
12421242
private EntityDomainType<R> getResultEntity() {
12431243
final JpaMetamodel jpaMetamodel = creationContext.getJpaMetamodel();
12441244
if ( expectedResultEntity != null ) {
1245-
final EntityDomainType<?> entityDescriptor = jpaMetamodel.entity( expectedResultEntity );
1245+
final EntityDomainType<?> entityDescriptor = jpaMetamodel.findEntityType( expectedResultEntity );
12461246
if ( entityDescriptor == null ) {
12471247
throw new SemanticException( "Query has no 'from' clause, and the result type '"
12481248
+ expectedResultEntity + "' is not an entity type", query );
12491249
}
1250+
//noinspection unchecked
12501251
return (EntityDomainType<R>) entityDescriptor;
12511252
}
12521253
else if ( expectedResultType != null ) {

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
@@ -3114,9 +3114,8 @@ private void registerEntityNameUsage(
31143114
if ( tableGroup.getModelPart() instanceof EmbeddableValuedModelPart ) {
31153115
persister = null;
31163116
final EmbeddableDomainType<?> embeddableDomainType = creationContext.getSessionFactory()
3117-
.getRuntimeMetamodels()
31183117
.getJpaMetamodel()
3119-
.embeddable( treatTargetTypeName );
3118+
.findEmbeddableType( treatTargetTypeName );
31203119
if ( embeddableDomainType == null || !embeddableDomainType.isPolymorphic() ) {
31213120
return;
31223121
}

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,16 @@ public EntityDomainType<?> entity(String entityName) {
779779
: null;
780780
}
781781

782+
@Override
783+
public @Nullable EntityDomainType<?> findEntityType(@Nullable String entityName) {
784+
if ( isEntityDefined(entityName) ) {
785+
return new MockEntityDomainType<>(entityName);
786+
}
787+
else {
788+
return null;
789+
}
790+
}
791+
782792
@Override
783793
public String qualifyImportableName(String queryName) {
784794
if (isClassDefined(queryName)) {
@@ -794,9 +804,18 @@ else if (isEntityDefined(queryName)) {
794804

795805
@Override
796806
public <X> ManagedDomainType<X> managedType(String typeName) {
807+
final ManagedDomainType<X> managedType = findManagedType( typeName );
808+
if ( managedType == null ) {
809+
throw new IllegalArgumentException("Not a managed type: " + typeName);
810+
}
811+
return managedType;
812+
}
813+
814+
@Override
815+
public @Nullable <X> ManagedDomainType<X> findManagedType(@Nullable String typeName) {
797816
final String entityName = qualifyName( typeName );
798817
//noinspection unchecked
799-
return entityName == null ? null : (ManagedDomainType<X>) entity( entityName );
818+
return entityName == null ? null : (ManagedDomainType<X>) findEntityType( entityName );
800819
}
801820

802821
@Override

0 commit comments

Comments
 (0)