Skip to content

Commit 47976e1

Browse files
committed
HHH-18983 finish the job of fully-unifying value generators with id generators
by letting value generators implement Configurable and ExportableProducer
1 parent b1c1337 commit 47976e1

File tree

4 files changed

+60
-56
lines changed

4 files changed

+60
-56
lines changed

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

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.hibernate.boot.spi.InFlightMetadataCollector;
2929
import org.hibernate.boot.spi.MetadataBuildingContext;
3030
import org.hibernate.boot.spi.PropertyData;
31+
import org.hibernate.engine.config.spi.ConfigurationService;
3132
import org.hibernate.generator.AnnotationBasedGenerator;
3233
import org.hibernate.generator.Assigned;
3334
import org.hibernate.generator.BeforeExecutionGenerator;
@@ -46,6 +47,7 @@
4647
import org.hibernate.mapping.KeyValue;
4748
import org.hibernate.mapping.PersistentClass;
4849
import org.hibernate.mapping.SimpleValue;
50+
import org.hibernate.mapping.Value;
4951
import org.hibernate.models.spi.AnnotationTarget;
5052
import org.hibernate.models.spi.MemberDetails;
5153
import 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
};

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

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@
2727
import org.hibernate.internal.CoreMessageLogger;
2828
import org.hibernate.mapping.Column;
2929
import org.hibernate.mapping.RootClass;
30-
import org.hibernate.mapping.SimpleValue;
3130
import org.hibernate.mapping.Table;
3231

3332
import jakarta.persistence.SequenceGenerator;
3433
import jakarta.persistence.TableGenerator;
3534
import jakarta.persistence.UniqueConstraint;
35+
import org.hibernate.mapping.Value;
3636

3737
import static org.hibernate.cfg.MappingSettings.ID_DB_STRUCTURE_NAMING_STRATEGY;
3838
import static org.hibernate.id.IdentifierGenerator.CONTRIBUTOR_NAME;
@@ -66,40 +66,25 @@ public class GeneratorParameters {
6666
* {@link Configurable#configure(GeneratorCreationContext, Properties)}.
6767
*/
6868
public static Properties collectParameters(
69-
SimpleValue identifierValue,
70-
Dialect dialect,
71-
RootClass rootClass) {
72-
final Properties params = new Properties();
73-
collectParameters( identifierValue, dialect, rootClass, params::put );
74-
return params;
75-
}
76-
77-
/**
78-
* Collect the parameters which should be passed to
79-
* {@link Configurable#configure(GeneratorCreationContext, Properties)}.
80-
*/
81-
public static Properties collectParameters(
82-
SimpleValue identifierValue,
69+
Value identifierValue,
8370
Dialect dialect,
8471
RootClass rootClass,
85-
Map<String, Object> configuration) {
86-
final Properties params = collectParameters( identifierValue, dialect, rootClass );
72+
Map<String, Object> configuration,
73+
ConfigurationService configService) {
74+
final Properties params = new Properties();
75+
collectParameters( identifierValue, dialect, rootClass, params::put, configService );
8776
if ( configuration != null ) {
8877
params.putAll( configuration );
8978
}
9079
return params;
9180
}
9281

9382
public static void collectParameters(
94-
SimpleValue identifierValue,
83+
Value identifierValue,
9584
Dialect dialect,
9685
RootClass rootClass,
97-
BiConsumer<String,String> parameterCollector) {
98-
99-
final ConfigurationService configService =
100-
identifierValue.getMetadata().getMetadataBuildingOptions()
101-
.getServiceRegistry().requireService( ConfigurationService.class );
102-
86+
BiConsumer<String, String> parameterCollector,
87+
ConfigurationService configService) {
10388
// default initial value and allocation size per-JPA defaults
10489
parameterCollector.accept( INITIAL_PARAM, String.valueOf( DEFAULT_INITIAL_VALUE ) );
10590
parameterCollector.accept( INCREMENT_PARAM, String.valueOf( defaultIncrement( configService ) ) );
@@ -124,7 +109,7 @@ public static int fallbackAllocationSize(Annotation generatorAnnotation, Metadat
124109
}
125110

126111
static void collectBaselineProperties(
127-
SimpleValue identifierValue,
112+
Value identifierValue,
128113
Dialect dialect,
129114
RootClass rootClass,
130115
BiConsumer<String,String> parameterCollector,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ public Property makeProperty() {
450450
private void handleValueGeneration(Property property) {
451451
if ( memberDetails != null ) {
452452
property.setValueGeneratorCreator(
453-
createValueGeneratorFromAnnotations( holder, name, memberDetails, buildingContext ) );
453+
createValueGeneratorFromAnnotations( holder, name, value, memberDetails, buildingContext ) );
454454
}
455455
}
456456

hibernate-core/src/main/java/org/hibernate/id/NativeGenerator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
import jakarta.persistence.GenerationType;
88
import jakarta.persistence.SequenceGenerator;
9-
import org.hibernate.boot.model.internal.GeneratorParameters;
109
import org.hibernate.boot.model.relational.Database;
1110
import org.hibernate.boot.model.relational.ExportableProducer;
1211
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
1312
import org.hibernate.dialect.Dialect;
13+
import org.hibernate.engine.config.spi.ConfigurationService;
1414
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1515
import org.hibernate.generator.AnnotationBasedGenerator;
1616
import org.hibernate.generator.BeforeExecutionGenerator;
@@ -22,14 +22,14 @@
2222
import org.hibernate.id.enhanced.TableGenerator;
2323
import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
2424
import org.hibernate.id.uuid.UuidGenerator;
25-
import org.hibernate.mapping.SimpleValue;
2625
import org.hibernate.persister.entity.EntityPersister;
2726

2827
import java.lang.reflect.Member;
2928
import java.util.EnumSet;
3029
import java.util.Map;
3130
import java.util.Properties;
3231

32+
import static org.hibernate.boot.model.internal.GeneratorParameters.collectParameters;
3333
import static org.hibernate.id.IdentifierGenerator.GENERATOR_NAME;
3434
import static org.hibernate.id.OptimizableGenerator.INCREMENT_PARAM;
3535

@@ -169,11 +169,12 @@ private void applyProperties(
169169
private static void applyCommonConfiguration(
170170
Map<String, Object> mapRef,
171171
GeneratorCreationContext context) {
172-
GeneratorParameters.collectParameters(
173-
(SimpleValue) context.getProperty().getValue(),
172+
collectParameters(
173+
context.getProperty().getValue(),
174174
context.getDatabase().getDialect(),
175175
context.getRootClass(),
176-
mapRef::put
176+
mapRef::put,
177+
context.getServiceRegistry().requireService( ConfigurationService.class )
177178
);
178179
mapRef.put( INCREMENT_PARAM, 1 );
179180
}

0 commit comments

Comments
 (0)