Skip to content

Commit 8ee0948

Browse files
committed
simplify Generator instantiation lifecycle
remove a bunch of unused parameters from methods in this package
1 parent df16ea9 commit 8ee0948

19 files changed

+317
-337
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.hibernate.boot.model.naming.Identifier;
5555
import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject;
5656
import org.hibernate.boot.model.relational.Database;
57-
import org.hibernate.boot.model.relational.ExportableProducer;
5857
import org.hibernate.boot.model.relational.Namespace;
5958
import org.hibernate.boot.model.relational.QualifiedTableName;
6059
import org.hibernate.boot.model.source.internal.ImplicitColumnNamingSecondPass;
@@ -81,7 +80,6 @@
8180
import org.hibernate.dialect.Dialect;
8281
import org.hibernate.engine.spi.FilterDefinition;
8382
import org.hibernate.engine.spi.SessionFactoryImplementor;
84-
import org.hibernate.generator.Generator;
8583
import org.hibernate.internal.CoreLogging;
8684
import org.hibernate.internal.CoreMessageLogger;
8785
import org.hibernate.internal.util.collections.CollectionHelper;
@@ -91,6 +89,7 @@
9189
import org.hibernate.mapping.DenormalizedTable;
9290
import org.hibernate.mapping.FetchProfile;
9391
import org.hibernate.mapping.ForeignKey;
92+
import org.hibernate.mapping.GeneratorSettings;
9493
import org.hibernate.mapping.IdentifierCollection;
9594
import org.hibernate.mapping.Join;
9695
import org.hibernate.mapping.KeyValue;
@@ -2204,15 +2203,22 @@ private void processExportableProducers() {
22042203

22052204
private void handleIdentifierValueBinding(
22062205
KeyValue identifierValueBinding, Dialect dialect, RootClass entityBinding, Property identifierProperty) {
2207-
// todo : store this result (back into the entity or into the KeyValue, maybe?)
2208-
// This process of instantiating the id-generator is called multiple times.
2209-
// It was done this way in the old code too, so no "regression" here; but
2210-
// it could be done better
22112206
try {
2212-
final Generator generator = identifierValueBinding.createGenerator( dialect, entityBinding, identifierProperty );
2213-
if ( generator instanceof ExportableProducer exportableProducer ) {
2214-
exportableProducer.registerExportables( getDatabase() );
2215-
}
2207+
// this call typically caches the new Generator in the instance of KeyValue
2208+
identifierValueBinding.createGenerator( dialect, entityBinding, identifierProperty,
2209+
new GeneratorSettings() {
2210+
@Override
2211+
public String getDefaultCatalog() {
2212+
//TODO: does not have access to property-configured default
2213+
return persistenceUnitMetadata.getDefaultCatalog();
2214+
}
2215+
2216+
@Override
2217+
public String getDefaultSchema() {
2218+
//TODO: does not have access to property-configured default
2219+
return persistenceUnitMetadata.getDefaultSchema();
2220+
}
2221+
} );
22162222
}
22172223
catch (MappingException e) {
22182224
// ignore this for now. The reasoning being "non-reflective" binding as needed

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

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,11 @@ public static <A extends Annotation> A findLocalizedMatch(
9494
// lastly, on the package
9595
final String packageInfoFqn = StringHelper.qualifier( idMember.getDeclaringType().getClassName() ) + ".package-info";
9696
try {
97-
final ClassDetails packageInfo = context.getMetadataCollector()
98-
.getSourceModelBuildingContext()
99-
.getClassDetailsRegistry()
100-
.resolveClassDetails( packageInfoFqn );
97+
final ClassDetails packageInfo =
98+
context.getMetadataCollector()
99+
.getSourceModelBuildingContext()
100+
.getClassDetailsRegistry()
101+
.resolveClassDetails( packageInfoFqn );
101102
for ( A generatorAnnotation : packageInfo.getRepeatedAnnotationUsages( generatorAnnotationType, sourceModelContext ) ) {
102103
if ( nameExtractor != null ) {
103104
final String registrationName = nameExtractor.apply( generatorAnnotation );
@@ -138,10 +139,7 @@ public static void handleUuidStrategy(
138139
idValue.setCustomIdGeneratorCreator( (creationContext) -> new UuidGenerator( generatorConfig, idMember ) );
139140
}
140141

141-
public static void handleIdentityStrategy(
142-
SimpleValue idValue,
143-
MemberDetails idMember,
144-
MetadataBuildingContext context) {
142+
public static void handleIdentityStrategy(SimpleValue idValue) {
145143
idValue.setCustomIdGeneratorCreator( (creationContext) -> new IdentityGenerator() );
146144
idValue.setColumnToIdentity();
147145
}
@@ -189,7 +187,6 @@ public static void handleGenericGenerator(
189187
GenericGenerator generatorConfig,
190188
PersistentClass entityMapping,
191189
SimpleValue idValue,
192-
MemberDetails idMember,
193190
MetadataBuildingContext context) {
194191
//generator settings
195192
final Map<String,String> configuration = new HashMap<>();
@@ -206,9 +203,7 @@ public static void handleGenericGenerator(
206203

207204
GeneratorBinder.createGeneratorFrom(
208205
new IdentifierGeneratorDefinition( generatorName, determineStrategyName( generatorConfig ), configuration ),
209-
idMember,
210206
idValue,
211-
entityMapping,
212207
context
213208
);
214209
}
@@ -232,17 +227,14 @@ public static void handleTableGenerator(
232227
TableGenerator generatorConfig,
233228
PersistentClass entityMapping,
234229
SimpleValue idValue,
235-
MemberDetails idMember,
236230
MetadataBuildingContext context) {
237231
final Map<String,String> configuration = new HashMap<>();
238232
applyBaselineConfiguration( generatorConfig, idValue, entityMapping.getRootClass(), context, configuration::put );
239-
org.hibernate.id.enhanced.TableGenerator.applyConfiguration( generatorConfig, idValue, configuration::put );
233+
org.hibernate.id.enhanced.TableGenerator.applyConfiguration( generatorConfig, configuration::put );
240234

241235
GeneratorBinder.createGeneratorFrom(
242236
new IdentifierGeneratorDefinition( generatorName, org.hibernate.id.enhanced.TableGenerator.class.getName(), configuration ),
243-
idMember,
244237
idValue,
245-
entityMapping,
246238
context
247239
);
248240

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

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.lang.annotation.Annotation;
88
import java.lang.reflect.InvocationTargetException;
99
import java.lang.reflect.Member;
10-
import java.util.ArrayList;
1110
import java.util.HashMap;
1211
import java.util.List;
1312
import java.util.Locale;
@@ -46,6 +45,7 @@
4645
import org.hibernate.internal.util.StringHelper;
4746
import org.hibernate.internal.util.collections.CollectionHelper;
4847
import org.hibernate.mapping.GeneratorCreator;
48+
import org.hibernate.mapping.KeyValue;
4949
import org.hibernate.mapping.PersistentClass;
5050
import org.hibernate.mapping.SimpleValue;
5151
import org.hibernate.models.spi.AnnotationTarget;
@@ -283,22 +283,6 @@ private static GenerationType interpretGenerationType(GeneratedValue generatedVa
283283
return strategy == null ? AUTO : strategy;
284284
}
285285

286-
/**
287-
* Collects definition objects for all generators defined using any of {@link TableGenerator},
288-
* {@link SequenceGenerator}, and {@link GenericGenerator} on the given annotated element.
289-
*/
290-
public static List<IdentifierGeneratorDefinition> collectIdGeneratorDefinitions(
291-
AnnotationTarget annotatedElement,
292-
MetadataBuildingContext context) {
293-
final ArrayList<IdentifierGeneratorDefinition> definitions = new ArrayList<>();
294-
visitIdGeneratorDefinitions(
295-
annotatedElement,
296-
definitions::add,
297-
context
298-
);
299-
return definitions;
300-
}
301-
302286
public static void visitIdGeneratorDefinitions(
303287
AnnotationTarget annotatedElement,
304288
Consumer<IdentifierGeneratorDefinition> consumer,
@@ -693,7 +677,7 @@ public static void callConfigure(
693677
Generator generator,
694678
Map<String, Object> configuration,
695679
SimpleValue identifierValue) {
696-
if ( generator instanceof final Configurable configurable ) {
680+
if ( generator instanceof Configurable configurable ) {
697681
final Properties parameters = collectParameters(
698682
identifierValue,
699683
creationContext.getDatabase().getDialect(),
@@ -702,6 +686,12 @@ public static void callConfigure(
702686
);
703687
configurable.configure( creationContext, parameters );
704688
}
689+
if ( generator instanceof ExportableProducer exportableProducer ) {
690+
exportableProducer.registerExportables( creationContext.getDatabase() );
691+
}
692+
if ( generator instanceof Configurable configurable ) {
693+
configurable.initialize( creationContext.getSqlStringGenerationContext() );
694+
}
705695
}
706696

707697
private static void checkIdGeneratorTiming(Class<? extends Annotation> annotationType, Generator generator) {
@@ -726,19 +716,20 @@ private static void createIdGenerator(
726716
// NOTE: `generatedValue` is never null here
727717
final GeneratedValue generatedValue = castNonNull( idMember.getDirectAnnotationUsage( GeneratedValue.class ) );
728718

719+
final InFlightMetadataCollector metadataCollector = context.getMetadataCollector();
729720
if ( isGlobalGeneratorNameGlobal( context ) ) {
730721
// process and register any generators defined on the member.
731722
// according to JPA these are also global.
732-
context.getMetadataCollector().getGlobalRegistrations().as( GlobalRegistrar.class ).collectIdGenerators( idMember );
733-
context.getMetadataCollector().addSecondPass( new StrictIdGeneratorResolverSecondPass(
723+
metadataCollector.getGlobalRegistrations().as( GlobalRegistrar.class ).collectIdGenerators( idMember );
724+
metadataCollector.addSecondPass( new StrictIdGeneratorResolverSecondPass(
734725
persistentClass,
735726
idValue,
736727
idMember,
737728
context
738729
) );
739730
}
740731
else {
741-
context.getMetadataCollector().addSecondPass( new IdGeneratorResolverSecondPass(
732+
metadataCollector.addSecondPass( new IdGeneratorResolverSecondPass(
742733
persistentClass,
743734
idValue,
744735
idMember,
@@ -750,7 +741,6 @@ private static void createIdGenerator(
750741

751742
public static void createGeneratorFrom(
752743
IdentifierGeneratorDefinition defaultedGenerator,
753-
MemberDetails idMember,
754744
SimpleValue idValue,
755745
Map<String, Object> configuration,
756746
MetadataBuildingContext context) {
@@ -766,43 +756,29 @@ public static void createGeneratorFrom(
766756
if ( identifierGenerator instanceof IdentityGenerator) {
767757
idValue.setColumnToIdentity();
768758
}
769-
770-
if ( identifierGenerator instanceof ExportableProducer exportableProducer ) {
771-
exportableProducer.registerExportables( creationContext.getDatabase() );
772-
}
773-
774759
return identifierGenerator;
775760
} );
776761
}
777762

778763

779764
public static void createGeneratorFrom(
780765
IdentifierGeneratorDefinition defaultedGenerator,
781-
MemberDetails idMember,
782766
SimpleValue idValue,
783-
PersistentClass persistentClass,
784767
MetadataBuildingContext context) {
785768
createGeneratorFrom(
786769
defaultedGenerator,
787-
idMember,
788770
idValue,
789-
buildConfigurationMap( defaultedGenerator, idValue, persistentClass ),
771+
buildConfigurationMap( idValue ),
790772
context
791773
);
792774
}
793775

794-
public static Map<String, Object> buildConfigurationMap(
795-
IdentifierGeneratorDefinition defaultedGenerator,
796-
SimpleValue idValue,
797-
PersistentClass persistentClass) {
776+
private static Map<String, Object> buildConfigurationMap(KeyValue idValue) {
798777
final Map<String,Object> configuration = new HashMap<>();
799-
800778
configuration.put( PersistentIdentifierGenerator.TABLE, idValue.getTable().getName() );
801-
802779
if ( idValue.getColumnSpan() == 1 ) {
803-
configuration.put( PersistentIdentifierGenerator.PK, idValue.getColumns().get( 0).getName() );
780+
configuration.put( PersistentIdentifierGenerator.PK, idValue.getColumns().get(0).getName() );
804781
}
805-
806782
return configuration;
807783
}
808784

@@ -941,15 +917,12 @@ static GeneratorCreator createValueGeneratorFromAnnotations(
941917
final List<? extends Annotation> generatorAnnotations =
942918
property.getMetaAnnotated( ValueGenerationType.class,
943919
context.getMetadataCollector().getSourceModelBuildingContext() );
944-
switch ( generatorAnnotations.size() ) {
945-
case 0:
946-
return null;
947-
case 1:
948-
return generatorCreator( property, generatorAnnotations.get(0), beanContainer( context ) );
949-
default:
950-
throw new AnnotationException( "Property '" + qualify( holder.getPath(), propertyName )
951-
+ "' has too many generator annotations: " + generatorAnnotations );
952-
}
920+
return switch ( generatorAnnotations.size() ) {
921+
case 0 -> null;
922+
case 1 -> generatorCreator( property, generatorAnnotations.get(0), beanContainer( context ) );
923+
default -> throw new AnnotationException( "Property '" + qualify( holder.getPath(), propertyName )
924+
+ "' has too many generator annotations: " + generatorAnnotations );
925+
};
953926
}
954927

955928
public static void applyIfNotEmpty(String name, String value, BiConsumer<String,String> consumer) {

0 commit comments

Comments
 (0)