Skip to content

Commit 42b9814

Browse files
committed
minor cleanups to AnnotationBinder
1. code formatting 2. don't leak an annotation type onto InFlightMetadataCollector SPI 3. use a record
1 parent 95779d4 commit 42b9814

File tree

4 files changed

+89
-85
lines changed

4 files changed

+89
-85
lines changed

hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.hibernate.MappingException;
1616
import org.hibernate.annotations.CollectionTypeRegistration;
1717
import org.hibernate.annotations.Imported;
18-
import org.hibernate.annotations.Parameter;
1918
import org.hibernate.boot.CacheRegionDefinition;
2019
import org.hibernate.boot.SessionFactoryBuilder;
2120
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
@@ -113,13 +112,12 @@
113112
import java.util.function.Supplier;
114113

115114
import static java.util.Collections.emptyList;
115+
import static org.hibernate.boot.model.internal.AnnotationBinder.extractParameters;
116116
import static org.hibernate.boot.model.naming.Identifier.toIdentifier;
117117
import static org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl.fromExplicit;
118118
import static org.hibernate.cfg.MappingSettings.DEFAULT_CATALOG;
119119
import static org.hibernate.cfg.MappingSettings.DEFAULT_SCHEMA;
120120
import static org.hibernate.boot.BootLogging.BOOT_LOGGER;
121-
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
122-
import static org.hibernate.internal.util.collections.CollectionHelper.mapOfSize;
123121

124122
/**
125123
* The implementation of the {@linkplain InFlightMetadataCollector in-flight
@@ -509,10 +507,11 @@ public Class<? extends UserType<?>> findRegisteredUserType(Class<?> basicType) {
509507

510508
private Map<CollectionClassification, CollectionTypeRegistrationDescriptor> collectionTypeRegistrations;
511509

512-
@Override
513-
public void addCollectionTypeRegistration(CollectionTypeRegistration registrationAnnotation) {
514-
addCollectionTypeRegistration( registrationAnnotation.classification(),
515-
toDescriptor( registrationAnnotation ) );
510+
@Override @Deprecated(forRemoval = true)
511+
public void addCollectionTypeRegistration(CollectionTypeRegistration registration) {
512+
addCollectionTypeRegistration( registration.classification(),
513+
new CollectionTypeRegistrationDescriptor( registration.type(),
514+
extractParameters( registration.parameters() ) ) );
516515
}
517516

518517
@Override
@@ -530,25 +529,6 @@ public CollectionTypeRegistrationDescriptor findCollectionTypeRegistration(Colle
530529

531530
}
532531

533-
private CollectionTypeRegistrationDescriptor toDescriptor(CollectionTypeRegistration registrationAnnotation) {
534-
return new CollectionTypeRegistrationDescriptor( registrationAnnotation.type(),
535-
extractParameters( registrationAnnotation.parameters() ) );
536-
}
537-
538-
private Map<String,String> extractParameters(Parameter[] annotationUsages) {
539-
if ( isEmpty( annotationUsages ) ) {
540-
return null;
541-
}
542-
else {
543-
final Map<String, String> result = mapOfSize( annotationUsages.length );
544-
for ( Parameter parameter : annotationUsages ) {
545-
result.put( parameter.name(), parameter.value() );
546-
}
547-
return result;
548-
}
549-
}
550-
551-
552532

553533
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
554534
// attribute converters

hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotationBinder.java

Lines changed: 76 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import jakarta.persistence.Entity;
88
import jakarta.persistence.FetchType;
99
import jakarta.persistence.Inheritance;
10-
import jakarta.persistence.InheritanceType;
1110
import jakarta.persistence.MappedSuperclass;
1211
import jakarta.persistence.Table;
1312
import org.hibernate.AnnotationException;
@@ -21,13 +20,15 @@
2120
import org.hibernate.annotations.Imported;
2221
import org.hibernate.annotations.JavaTypeRegistration;
2322
import org.hibernate.annotations.JdbcTypeRegistration;
23+
import org.hibernate.annotations.Parameter;
2424
import org.hibernate.annotations.TypeRegistration;
2525
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
2626
import org.hibernate.boot.model.NamedEntityGraphDefinition;
2727
import org.hibernate.boot.model.convert.spi.RegisteredConversion;
2828
import org.hibernate.boot.models.HibernateAnnotations;
2929
import org.hibernate.boot.models.JpaAnnotations;
3030
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
31+
import org.hibernate.boot.spi.InFlightMetadataCollector.CollectionTypeRegistrationDescriptor;
3132
import org.hibernate.boot.spi.MetadataBuildingContext;
3233
import org.hibernate.models.spi.AnnotationTarget;
3334
import org.hibernate.models.spi.ClassDetails;
@@ -40,6 +41,7 @@
4041
import java.util.List;
4142
import java.util.Map;
4243

44+
import static jakarta.persistence.InheritanceType.SINGLE_TABLE;
4345
import static org.hibernate.boot.model.internal.AnnotatedClassType.EMBEDDABLE;
4446
import static org.hibernate.boot.model.internal.AnnotatedClassType.ENTITY;
4547
import static org.hibernate.boot.model.internal.EntityBinder.bindEntityClass;
@@ -55,6 +57,8 @@
5557
import static org.hibernate.boot.model.internal.QueryBinder.bindQuery;
5658
import static org.hibernate.boot.model.internal.QueryBinder.bindSqlResultSetMapping;
5759
import static org.hibernate.internal.util.StringHelper.unqualify;
60+
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
61+
import static org.hibernate.internal.util.collections.CollectionHelper.mapOfSize;
5862
import static org.hibernate.mapping.MetadataSource.ANNOTATIONS;
5963

6064
/**
@@ -74,35 +78,32 @@ public static void bindDefaults(MetadataBuildingContext context) {
7478
final var metadataCollector = context.getMetadataCollector();
7579
final var globalRegistrations = metadataCollector.getGlobalRegistrations();
7680

77-
7881
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7982
// id generators
8083

8184
globalRegistrations.getSequenceGeneratorRegistrations().forEach( (name, generatorRegistration) -> {
8285
final var definitionBuilder = new IdentifierGeneratorDefinition.Builder();
8386
interpretSequenceGenerator( generatorRegistration.configuration(), definitionBuilder );
84-
final var idGenDef = definitionBuilder.build();
87+
final var generatorDefinition = definitionBuilder.build();
8588
BOOT_LOGGER.addingGlobalSequenceGenerator( name );
86-
metadataCollector.addDefaultIdentifierGenerator( idGenDef );
89+
metadataCollector.addDefaultIdentifierGenerator( generatorDefinition );
8790
} );
8891

8992
globalRegistrations.getTableGeneratorRegistrations().forEach( (name, generatorRegistration) -> {
9093
final var definitionBuilder = new IdentifierGeneratorDefinition.Builder();
9194
interpretTableGenerator( generatorRegistration.configuration(), definitionBuilder );
92-
final var idGenDef = definitionBuilder.build();
95+
final var generatorDefinition = definitionBuilder.build();
9396
BOOT_LOGGER.addingGlobalTableGenerator( name );
94-
metadataCollector.addDefaultIdentifierGenerator( idGenDef );
97+
metadataCollector.addDefaultIdentifierGenerator( generatorDefinition );
9598
} );
9699

97-
98100
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99101
// result-set-mappings
100102

101103
globalRegistrations.getSqlResultSetMappingRegistrations().forEach( (name, mappingRegistration) -> {
102104
bindSqlResultSetMapping( mappingRegistration.configuration(), context, true );
103105
} );
104106

105-
106107
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107108
// queries
108109

@@ -177,13 +178,13 @@ private static void bindNamedHibernateQueries(AnnotationTarget annotationTarget,
177178
annotationTarget.forEachRepeatedAnnotationUsages(
178179
HibernateAnnotations.NAMED_QUERY,
179180
sourceModelContext,
180-
(usage) -> bindQuery( usage, context, annotationTarget )
181+
usage -> bindQuery( usage, context, annotationTarget )
181182
);
182183

183184
annotationTarget.forEachRepeatedAnnotationUsages(
184185
HibernateAnnotations.NAMED_NATIVE_QUERY,
185186
sourceModelContext,
186-
(usage) -> bindNativeQuery( usage, context, annotationTarget )
187+
usage -> bindNativeQuery( usage, context, annotationTarget )
187188
);
188189
}
189190

@@ -193,25 +194,25 @@ private static void bindNamedJpaQueries(AnnotationTarget annotationTarget, Metad
193194
annotationTarget.forEachRepeatedAnnotationUsages(
194195
JpaAnnotations.SQL_RESULT_SET_MAPPING,
195196
sourceModelContext,
196-
(usage) -> bindSqlResultSetMapping( usage, context,false )
197+
usage -> bindSqlResultSetMapping( usage, context,false )
197198
);
198199

199200
annotationTarget.forEachRepeatedAnnotationUsages(
200201
JpaAnnotations.NAMED_QUERY,
201202
sourceModelContext,
202-
(usage) -> bindQuery( usage, context, false, annotationTarget )
203+
usage -> bindQuery( usage, context, false, annotationTarget )
203204
);
204205

205206
annotationTarget.forEachRepeatedAnnotationUsages(
206207
JpaAnnotations.NAMED_NATIVE_QUERY,
207208
sourceModelContext,
208-
(usage) -> bindNativeQuery( usage, context, annotationTarget, false )
209+
usage -> bindNativeQuery( usage, context, annotationTarget, false )
209210
);
210211

211212
annotationTarget.forEachRepeatedAnnotationUsages(
212213
JpaAnnotations.NAMED_STORED_PROCEDURE_QUERY,
213214
sourceModelContext,
214-
(usage) -> bindNamedStoredProcedureQuery( usage, context, false )
215+
usage -> bindNamedStoredProcedureQuery( usage, context, false )
215216
);
216217
}
217218

@@ -226,7 +227,8 @@ private static void bindNamedJpaQueries(AnnotationTarget annotationTarget, Metad
226227
public static void bindClass(
227228
ClassDetails classDetails,
228229
Map<ClassDetails, InheritanceState> inheritanceStatePerClass,
229-
MetadataBuildingContext context) throws MappingException {
230+
MetadataBuildingContext context)
231+
throws MappingException {
230232

231233
detectMappedSuperclassProblems( classDetails );
232234

@@ -257,7 +259,7 @@ private static void handleImport(ClassDetails annotatedClass, MetadataBuildingCo
257259

258260
private static void detectMappedSuperclassProblems(ClassDetails annotatedClass) {
259261
if ( annotatedClass.hasDirectAnnotationUsage( MappedSuperclass.class ) ) {
260-
//@Entity and @MappedSuperclass on the same class leads to a NPE down the road
262+
// @Entity and @MappedSuperclass on the same class leads to NPE down the road
261263
if ( annotatedClass.hasDirectAnnotationUsage( Entity.class ) ) {
262264
throw new AnnotationException( "Type '" + annotatedClass.getName()
263265
+ "' is annotated both '@Entity' and '@MappedSuperclass'" );
@@ -279,17 +281,45 @@ private static void bindTypeDescriptorRegistrations(
279281
final var managedBeanRegistry = context.getBootstrapContext().getManagedBeanRegistry();
280282
final var sourceModelContext = modelsContext( context );
281283

282-
annotatedElement.forEachAnnotationUsage( JavaTypeRegistration.class, sourceModelContext, (usage) -> {
283-
handleJavaTypeRegistration( context, managedBeanRegistry, usage );
284-
} );
284+
annotatedElement.forEachAnnotationUsage(
285+
JavaTypeRegistration.class,
286+
sourceModelContext,
287+
usage -> handleJavaTypeRegistration( context, managedBeanRegistry, usage )
288+
);
285289

286-
annotatedElement.forEachAnnotationUsage( JdbcTypeRegistration.class, sourceModelContext, (usage) -> {
287-
handleJdbcTypeRegistration( context, managedBeanRegistry, usage );
288-
} );
290+
annotatedElement.forEachAnnotationUsage(
291+
JdbcTypeRegistration.class,
292+
sourceModelContext,
293+
usage -> handleJdbcTypeRegistration( context, managedBeanRegistry, usage )
294+
);
289295

290-
annotatedElement.forEachAnnotationUsage( CollectionTypeRegistration.class, sourceModelContext, (usage) -> {
291-
context.getMetadataCollector().addCollectionTypeRegistration( usage );
292-
} );
296+
annotatedElement.forEachAnnotationUsage(
297+
CollectionTypeRegistration.class,
298+
sourceModelContext,
299+
usage -> handleCollectionTypeRegistration( context, usage )
300+
);
301+
}
302+
303+
private static void handleCollectionTypeRegistration(
304+
MetadataBuildingContext context,
305+
CollectionTypeRegistration annotation) {
306+
context.getMetadataCollector()
307+
.addCollectionTypeRegistration( annotation.classification(),
308+
new CollectionTypeRegistrationDescriptor( annotation.type(),
309+
extractParameters( annotation.parameters() ) ) );
310+
}
311+
312+
public static Map<String,String> extractParameters(Parameter[] parameters) {
313+
if ( isEmpty( parameters ) ) {
314+
return null;
315+
}
316+
else {
317+
final Map<String, String> result = mapOfSize( parameters.length );
318+
for ( var parameter : parameters ) {
319+
result.put( parameter.name(), parameter.value() );
320+
}
321+
return result;
322+
}
293323
}
294324

295325
private static void handleJdbcTypeRegistration(
@@ -329,9 +359,11 @@ private static <T> T getBean(
329359
private static void bindEmbeddableInstantiatorRegistrations(
330360
AnnotationTarget annotatedElement,
331361
MetadataBuildingContext context) {
332-
annotatedElement.forEachAnnotationUsage( EmbeddableInstantiatorRegistration.class, modelsContext( context ), (usage) -> {
333-
handleEmbeddableInstantiatorRegistration( context, usage );
334-
} );
362+
annotatedElement.forEachAnnotationUsage(
363+
EmbeddableInstantiatorRegistration.class,
364+
modelsContext( context ),
365+
usage -> handleEmbeddableInstantiatorRegistration( context, usage )
366+
);
335367
}
336368

337369
private static void handleEmbeddableInstantiatorRegistration(
@@ -346,17 +378,21 @@ private static void handleEmbeddableInstantiatorRegistration(
346378
private static void bindCompositeUserTypeRegistrations(
347379
AnnotationTarget annotatedElement,
348380
MetadataBuildingContext context) {
349-
annotatedElement.forEachAnnotationUsage( CompositeTypeRegistration.class, modelsContext( context ), (usage) -> {
350-
handleCompositeUserTypeRegistration( context, usage );
351-
} );
381+
annotatedElement.forEachAnnotationUsage(
382+
CompositeTypeRegistration.class,
383+
modelsContext( context ),
384+
usage -> handleCompositeUserTypeRegistration( context, usage )
385+
);
352386
}
353387

354388
private static void bindUserTypeRegistrations(
355389
AnnotationTarget annotatedElement,
356390
MetadataBuildingContext context) {
357-
annotatedElement.forEachAnnotationUsage( TypeRegistration.class, modelsContext( context ), (usage) -> {
358-
handleUserTypeRegistration( context, usage );
359-
} );
391+
annotatedElement.forEachAnnotationUsage(
392+
TypeRegistration.class,
393+
modelsContext( context ),
394+
usage -> handleUserTypeRegistration( context, usage )
395+
);
360396
}
361397

362398
private static void handleUserTypeRegistration(
@@ -382,10 +418,11 @@ private static void handleCompositeUserTypeRegistration(
382418
}
383419

384420
private static void bindConverterRegistrations(AnnotationTarget container, MetadataBuildingContext context) {
385-
final ModelsContext sourceModelContext = modelsContext( context );
386-
container.forEachAnnotationUsage( ConverterRegistration.class, sourceModelContext, (usage) -> {
387-
handleConverterRegistration( usage, context );
388-
} );
421+
container.forEachAnnotationUsage(
422+
ConverterRegistration.class,
423+
modelsContext( context ),
424+
usage -> handleConverterRegistration( usage, context )
425+
);
389426
}
390427

391428
private static void handleConverterRegistration(ConverterRegistration registration, MetadataBuildingContext context) {
@@ -500,7 +537,7 @@ private static void checkMixedInheritance(ClassDetails classDetails, Inheritance
500537
final var inheritanceType = state.getType();
501538
final var superclassInheritanceType = superclassState.getType();
502539
if ( inheritanceType != null && superclassInheritanceType != null ) {
503-
final boolean nonDefault = InheritanceType.SINGLE_TABLE != inheritanceType;
540+
final boolean nonDefault = SINGLE_TABLE != inheritanceType;
504541
final boolean mixingStrategy = inheritanceType != superclassInheritanceType;
505542
if ( nonDefault && mixingStrategy ) {
506543
throw new AnnotationException( "Entity '" + classDetails.getName()

hibernate-core/src/main/java/org/hibernate/boot/model/internal/CollectionBinder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -798,8 +798,8 @@ private static CollectionBinder createBinderFromTypeRegistration(
798798
property,
799799
() -> createUserTypeBean(
800800
property.getDeclaringType().getName() + "#" + property.getName(),
801-
typeRegistration.getImplementation(),
802-
typeRegistration.getParameters(),
801+
typeRegistration.implementation(),
802+
typeRegistration.parameters(),
803803
context.getBootstrapContext(),
804804
context.getMetadataCollector().getMetadataBuildingOptions().isAllowExtensionsInCdi()
805805
),

hibernate-core/src/main/java/org/hibernate/boot/spi/InFlightMetadataCollector.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.hibernate.DuplicateMappingException;
1414
import org.hibernate.HibernateException;
1515
import org.hibernate.MappingException;
16-
import org.hibernate.annotations.CollectionTypeRegistration;
1716
import org.hibernate.boot.internal.NamedProcedureCallDefinitionImpl;
1817
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
1918
import org.hibernate.boot.model.NamedEntityGraphDefinition;
@@ -359,7 +358,8 @@ void addTableNameBinding(
359358
void registerUserType(Class<?> embeddableType, Class<? extends UserType<?>> userType);
360359
Class<? extends UserType<?>> findRegisteredUserType(Class<?> basicType);
361360

362-
void addCollectionTypeRegistration(CollectionTypeRegistration registrationAnnotation);
361+
@Deprecated(since = "7.2", forRemoval = true) // let's not leak annotation types onto this SPI
362+
void addCollectionTypeRegistration(org.hibernate.annotations.CollectionTypeRegistration registrationAnnotation);
363363
void addCollectionTypeRegistration(CollectionClassification classification, CollectionTypeRegistrationDescriptor descriptor);
364364
CollectionTypeRegistrationDescriptor findCollectionTypeRegistration(CollectionClassification classification);
365365

@@ -408,21 +408,8 @@ EntityTableXref addEntityTableXref(
408408
Map<String,Join> getJoins(String entityName);
409409

410410

411-
class CollectionTypeRegistrationDescriptor {
412-
private final Class<? extends UserCollectionType> implementation;
413-
private final Map<String,String> parameters;
414-
415-
public CollectionTypeRegistrationDescriptor(Class<? extends UserCollectionType> implementation, Map<String,String> parameters) {
416-
this.implementation = implementation;
417-
this.parameters = parameters;
418-
}
419-
420-
public Class<? extends UserCollectionType> getImplementation() {
421-
return implementation;
422-
}
423-
424-
public Map<String,String> getParameters() {
425-
return parameters;
426-
}
411+
record CollectionTypeRegistrationDescriptor(
412+
Class<? extends UserCollectionType> implementation,
413+
Map<String, String> parameters) {
427414
}
428415
}

0 commit comments

Comments
 (0)