77import jakarta .persistence .Entity ;
88import jakarta .persistence .FetchType ;
99import jakarta .persistence .Inheritance ;
10- import jakarta .persistence .InheritanceType ;
1110import jakarta .persistence .MappedSuperclass ;
1211import jakarta .persistence .Table ;
1312import org .hibernate .AnnotationException ;
2120import org .hibernate .annotations .Imported ;
2221import org .hibernate .annotations .JavaTypeRegistration ;
2322import org .hibernate .annotations .JdbcTypeRegistration ;
23+ import org .hibernate .annotations .Parameter ;
2424import org .hibernate .annotations .TypeRegistration ;
2525import org .hibernate .boot .model .IdentifierGeneratorDefinition ;
2626import org .hibernate .boot .model .NamedEntityGraphDefinition ;
2727import org .hibernate .boot .model .convert .spi .RegisteredConversion ;
2828import org .hibernate .boot .models .HibernateAnnotations ;
2929import org .hibernate .boot .models .JpaAnnotations ;
3030import org .hibernate .boot .registry .classloading .spi .ClassLoaderService ;
31+ import org .hibernate .boot .spi .InFlightMetadataCollector .CollectionTypeRegistrationDescriptor ;
3132import org .hibernate .boot .spi .MetadataBuildingContext ;
3233import org .hibernate .models .spi .AnnotationTarget ;
3334import org .hibernate .models .spi .ClassDetails ;
4041import java .util .List ;
4142import java .util .Map ;
4243
44+ import static jakarta .persistence .InheritanceType .SINGLE_TABLE ;
4345import static org .hibernate .boot .model .internal .AnnotatedClassType .EMBEDDABLE ;
4446import static org .hibernate .boot .model .internal .AnnotatedClassType .ENTITY ;
4547import static org .hibernate .boot .model .internal .EntityBinder .bindEntityClass ;
5557import static org .hibernate .boot .model .internal .QueryBinder .bindQuery ;
5658import static org .hibernate .boot .model .internal .QueryBinder .bindSqlResultSetMapping ;
5759import 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 ;
5862import 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 ()
0 commit comments