2828import org .hibernate .boot .spi .InFlightMetadataCollector ;
2929import org .hibernate .boot .spi .MetadataBuildingContext ;
3030import org .hibernate .boot .spi .PropertyData ;
31+ import org .hibernate .engine .config .spi .ConfigurationService ;
3132import org .hibernate .generator .AnnotationBasedGenerator ;
3233import org .hibernate .generator .Assigned ;
3334import org .hibernate .generator .BeforeExecutionGenerator ;
4647import org .hibernate .mapping .KeyValue ;
4748import org .hibernate .mapping .PersistentClass ;
4849import org .hibernate .mapping .SimpleValue ;
50+ import org .hibernate .mapping .Value ;
4951import org .hibernate .models .spi .AnnotationTarget ;
5052import org .hibernate .models .spi .MemberDetails ;
5153import org .hibernate .models .spi .SourceModelBuildingContext ;
@@ -344,17 +346,11 @@ private static void checkGeneratorClass(Class<? extends Generator> generatorClas
344346 }
345347
346348 private static void checkGeneratorInterfaces (Class <? extends Generator > generatorClass ) {
347- // we don't yet support the additional "fancy" operations of
348- // IdentifierGenerator with regular generators, though this
349- // would be extremely easy to add if anyone asks for it
349+ // A regular value generator should not implement legacy IdentifierGenerator
350350 if ( IdentifierGenerator .class .isAssignableFrom ( generatorClass ) ) {
351351 throw new AnnotationException ("Generator class '" + generatorClass .getName ()
352352 + "' implements 'IdentifierGenerator' and may not be used with '@ValueGenerationType'" );
353353 }
354- if ( ExportableProducer .class .isAssignableFrom ( generatorClass ) ) {
355- throw new AnnotationException ("Generator class '" + generatorClass .getName ()
356- + "' implements 'ExportableProducer' and may not be used with '@ValueGenerationType'" );
357- }
358354 }
359355
360356 /**
@@ -363,6 +359,7 @@ private static void checkGeneratorInterfaces(Class<? extends Generator> generato
363359 */
364360 private static GeneratorCreator generatorCreator (
365361 MemberDetails memberDetails ,
362+ Value value ,
366363 Annotation annotation ,
367364 BeanContainer beanContainer ) {
368365 final Class <? extends Annotation > annotationType = annotation .annotationType ();
@@ -372,21 +369,42 @@ private static GeneratorCreator generatorCreator(
372369 checkGeneratorClass ( generatorClass );
373370 checkGeneratorInterfaces ( generatorClass );
374371 return creationContext -> {
375- final Generator generator = instantiateGenerator (
376- annotation ,
377- beanContainer ,
378- creationContext ,
379- generatorClass ,
380- memberDetails ,
381- annotationType
382- );
383- callInitialize ( annotation , memberDetails , creationContext , generator );
384- //TODO: callConfigure( creationContext, generator, emptyMap(), identifierValue );
372+ final Generator generator =
373+ instantiateAndInitializeGenerator (
374+ value ,
375+ annotation ,
376+ beanContainer ,
377+ creationContext ,
378+ generatorClass ,
379+ memberDetails ,
380+ annotationType
381+ );
385382 checkVersionGenerationAlways ( memberDetails , generator );
386383 return generator ;
387384 };
388385 }
389386
387+ private static Generator instantiateAndInitializeGenerator (
388+ Value value ,
389+ Annotation annotation ,
390+ BeanContainer beanContainer ,
391+ GeneratorCreationContext creationContext ,
392+ Class <? extends Generator > generatorClass ,
393+ MemberDetails memberDetails ,
394+ Class <? extends Annotation > annotationType ) {
395+ final Generator generator = instantiateGenerator (
396+ annotation ,
397+ beanContainer ,
398+ creationContext ,
399+ generatorClass ,
400+ memberDetails ,
401+ annotationType
402+ );
403+ callInitialize ( annotation , memberDetails , creationContext , generator );
404+ callConfigure ( creationContext , generator , emptyMap (), value );
405+ return generator ;
406+ }
407+
390408 /**
391409 * Return a {@link GeneratorCreator} for an id attribute annotated
392410 * with an {@linkplain IdGeneratorType id generator annotation}.
@@ -403,16 +421,15 @@ private static GeneratorCreator identifierGeneratorCreator(
403421 checkGeneratorClass ( generatorClass );
404422 return creationContext -> {
405423 final Generator generator =
406- instantiateGenerator (
424+ instantiateAndInitializeGenerator (
425+ identifierValue ,
407426 annotation ,
408427 beanContainer ,
409428 creationContext ,
410429 generatorClass ,
411430 idAttributeMember ,
412431 annotationType
413432 );
414- callInitialize ( annotation , idAttributeMember , creationContext , generator );
415- callConfigure ( creationContext , generator , emptyMap (), identifierValue );
416433 checkIdGeneratorTiming ( annotationType , generator );
417434 return generator ;
418435 };
@@ -610,13 +627,14 @@ public static void callConfigure(
610627 GeneratorCreationContext creationContext ,
611628 Generator generator ,
612629 Map <String , Object > configuration ,
613- SimpleValue identifierValue ) {
630+ Value value ) {
614631 if ( generator instanceof Configurable configurable ) {
615632 final Properties parameters = collectParameters (
616- identifierValue ,
633+ value ,
617634 creationContext .getDatabase ().getDialect (),
618635 creationContext .getRootClass (),
619- configuration
636+ configuration ,
637+ creationContext .getServiceRegistry ().requireService ( ConfigurationService .class )
620638 );
621639 configurable .configure ( creationContext , parameters );
622640 }
@@ -838,13 +856,13 @@ else if ( idAttributeMember.hasDirectAnnotationUsage( GeneratedValue.class ) ) {
838856 */
839857 static GeneratorCreator createValueGeneratorFromAnnotations (
840858 PropertyHolder holder , String propertyName ,
841- MemberDetails property , MetadataBuildingContext context ) {
859+ Value value , MemberDetails property , MetadataBuildingContext context ) {
842860 final List <? extends Annotation > generatorAnnotations =
843861 property .getMetaAnnotated ( ValueGenerationType .class ,
844862 context .getMetadataCollector ().getSourceModelBuildingContext () );
845863 return switch ( generatorAnnotations .size () ) {
846864 case 0 -> null ;
847- case 1 -> generatorCreator ( property , generatorAnnotations .get (0 ), beanContainer ( context ) );
865+ case 1 -> generatorCreator ( property , value , generatorAnnotations .get (0 ), beanContainer ( context ) );
848866 default -> throw new AnnotationException ( "Property '" + qualify ( holder .getPath (), propertyName )
849867 + "' has too many generator annotations: " + generatorAnnotations );
850868 };
0 commit comments