diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java index 6937abee32..2eebdfe521 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java @@ -1015,7 +1015,7 @@ private void bindEntityVersion( versionValue.setNullValue( "undefined" ); } if ( versionAttributeSource.getSource().equals("db") ) { - property.setValueGenerationStrategy( + property.setValueGeneratorCreator( context -> new SourceGeneration( DB_SOURCE, property.getType().getReturnedClass() ) ); } @@ -2548,7 +2548,7 @@ private void bindProperty( ); } if ( generationTiming.isNotNever() ) { - property.setValueGenerationStrategy( context -> new GeneratedValueGeneration( generationTiming ) ); + property.setValueGeneratorCreator(context -> new GeneratedValueGeneration( generationTiming ) ); // generated properties can *never* be insertable... if ( property.isInsertable() && generationTiming.includesInsert() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java b/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java index 1acbd04440..b7a4eb2146 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java @@ -381,7 +381,7 @@ private static Property cloneProperty(PersistentClass ownerEntity, MetadataBuild clone.setInsertable( false ); clone.setUpdateable( false ); clone.setNaturalIdentifier( false ); - clone.setValueGenerationStrategy( property.getValueGenerationStrategy() ); + clone.setValueGeneratorCreator( property.getValueGeneratorCreator() ); return clone; } } diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/ArrayBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/ArrayBinder.java index f0c0568c02..9193328188 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/ArrayBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/ArrayBinder.java @@ -12,7 +12,6 @@ import org.hibernate.mapping.Array; import org.hibernate.mapping.Collection; import org.hibernate.mapping.PersistentClass; -import org.hibernate.mapping.SemanticsResolver; import org.hibernate.resource.beans.spi.ManagedBean; import org.hibernate.usertype.UserCollectionType; diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/MapBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/MapBinder.java index c874db319a..28aefa07e9 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/MapBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/MapBinder.java @@ -530,7 +530,7 @@ private Component createIndexComponent(Collection collection, PersistentClass as for ( Property property : component.getProperties() ) { final Property newProperty = new Property(); newProperty.setCascade( property.getCascade() ); - newProperty.setValueGenerationStrategy( property.getValueGenerationStrategy() ); + newProperty.setValueGeneratorCreator( property.getValueGeneratorCreator() ); newProperty.setInsertable( false ); newProperty.setUpdateable( false ); newProperty.setMetaAttributes( property.getMetaAttributes() ); diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java index 885ab6fd55..453b44e62a 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java @@ -365,7 +365,7 @@ public Property makeProperty() { if ( this.property != null ) { if ( entityBinder != null ) { handleNaturalId( property ); - property.setValueGenerationStrategy( getValueGenerationFromAnnotations( this.property ) ); + property.setValueGeneratorCreator( getValueGenerationFromAnnotations( this.property ) ); } // HHH-4635 -- needed for dialect-specific property ordering property.setLob( this.property.isAnnotationPresent( Lob.class ) ); diff --git a/hibernate-core/src/main/java/org/hibernate/id/factory/internal/IdentifierGeneratorUtil.java b/hibernate-core/src/main/java/org/hibernate/id/factory/internal/IdentifierGeneratorUtil.java index 59ca728e39..3901c5ece0 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/factory/internal/IdentifierGeneratorUtil.java +++ b/hibernate-core/src/main/java/org/hibernate/id/factory/internal/IdentifierGeneratorUtil.java @@ -39,11 +39,11 @@ public static Generator createLegacyIdentifierGenerator( // when this method is called by Hibernate ORM, defaultSchema and defaultCatalog are always // null, and defaults are handled later. if ( defaultSchema != null ) { - params.setProperty( PersistentIdentifierGenerator.SCHEMA, defaultSchema); + params.setProperty( PersistentIdentifierGenerator.SCHEMA, defaultSchema ); } if ( defaultCatalog != null ) { - params.setProperty( PersistentIdentifierGenerator.CATALOG, defaultCatalog); + params.setProperty( PersistentIdentifierGenerator.CATALOG, defaultCatalog ); } // default initial value and allocation size per-JPA defaults diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Component.java b/hibernate-core/src/main/java/org/hibernate/mapping/Component.java index c7663f33db..5026353200 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Component.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Component.java @@ -436,17 +436,11 @@ private Generator buildIdentifierGenerator( RootClass rootClass) throws MappingException { final boolean hasCustomGenerator = ! DEFAULT_ID_GEN_STRATEGY.equals( getIdentifierGeneratorStrategy() ); if ( hasCustomGenerator ) { - return super.createGenerator( - identifierGeneratorFactory, - dialect, - rootClass - ); + return super.createGenerator( identifierGeneratorFactory, dialect, rootClass ); } final Class> entityClass = rootClass.getMappedClass(); final Class> attributeDeclarer; // what class is the declarer of the composite pk attributes - CompositeNestedGeneratedValueGenerator.GenerationContextLocator locator; - // IMPL NOTE : See the javadoc discussion on CompositeNestedGeneratedValueGenerator wrt the // various scenarios for which we need to account here if ( rootClass.getIdentifierMapper() != null ) { @@ -458,11 +452,12 @@ else if ( rootClass.getIdentifierProperty() != null ) { attributeDeclarer = resolveComponentClass(); } else { - // we have the "straight up" embedded (again the hibernate term) component identifier + // we have the "straight up" embedded (again the Hibernate term) component identifier attributeDeclarer = entityClass; } - locator = new StandardGenerationContextLocator( rootClass.getEntityName() ); + final CompositeNestedGeneratedValueGenerator.GenerationContextLocator locator = + new StandardGenerationContextLocator( rootClass.getEntityName() ); final CompositeNestedGeneratedValueGenerator generator = new CompositeNestedGeneratedValueGenerator( locator ); for ( Property property : getProperties() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/GeneratorCreator.java b/hibernate-core/src/main/java/org/hibernate/mapping/GeneratorCreator.java index 87559c7e29..5b2e9c553e 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/GeneratorCreator.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/GeneratorCreator.java @@ -6,9 +6,11 @@ */ package org.hibernate.mapping; +import org.hibernate.Internal; import org.hibernate.tuple.Generator; import org.hibernate.tuple.GeneratorCreationContext; +@Internal @FunctionalInterface public interface GeneratorCreator { Generator createGenerator(GeneratorCreationContext context); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/IdentifierGeneratorCreator.java b/hibernate-core/src/main/java/org/hibernate/mapping/IdentifierGeneratorCreator.java index 708f74bc09..7a9cb69e45 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/IdentifierGeneratorCreator.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/IdentifierGeneratorCreator.java @@ -6,9 +6,11 @@ */ package org.hibernate.mapping; +import org.hibernate.Internal; import org.hibernate.id.factory.spi.CustomIdGeneratorCreationContext; import org.hibernate.tuple.Generator; +@Internal @FunctionalInterface public interface IdentifierGeneratorCreator { Generator createGenerator(CustomIdGeneratorCreationContext context); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Property.java b/hibernate-core/src/main/java/org/hibernate/mapping/Property.java index 25bd1dc065..f83f187c92 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Property.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Property.java @@ -14,19 +14,24 @@ import java.util.StringTokenizer; import org.hibernate.HibernateException; +import org.hibernate.Internal; import org.hibernate.MappingException; import org.hibernate.PropertyNotFoundException; +import org.hibernate.boot.model.relational.Database; import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementHelper; import org.hibernate.engine.spi.CascadeStyle; import org.hibernate.engine.spi.CascadeStyles; import org.hibernate.engine.spi.Mapping; import org.hibernate.jpa.event.spi.CallbackDefinition; import org.hibernate.metamodel.RepresentationMode; +import org.hibernate.metamodel.spi.RuntimeModelCreationContext; import org.hibernate.property.access.spi.Getter; import org.hibernate.property.access.spi.PropertyAccessStrategy; import org.hibernate.property.access.spi.PropertyAccessStrategyResolver; import org.hibernate.property.access.spi.Setter; import org.hibernate.service.ServiceRegistry; +import org.hibernate.tuple.Generator; +import org.hibernate.tuple.GeneratorCreationContext; import org.hibernate.type.CompositeType; import org.hibernate.type.Type; @@ -44,7 +49,7 @@ public class Property implements Serializable, MetaAttributable { private boolean insertable = true; private boolean selectable = true; private boolean optimisticLocked = true; - private GeneratorCreator generator; + private GeneratorCreator generatorCreator; private String propertyAccessorName; private PropertyAccessStrategy propertyAccessStrategy; private boolean lazy; @@ -215,12 +220,14 @@ public boolean isInsertable() { return insertable && value.hasAnyInsertableColumns(); } - public GeneratorCreator getValueGenerationStrategy() { - return generator; + @Internal + public GeneratorCreator getValueGeneratorCreator() { + return generatorCreator; } - public void setValueGenerationStrategy(GeneratorCreator generator) { - this.generator = generator; + @Internal + public void setValueGeneratorCreator(GeneratorCreator generator) { + this.generatorCreator = generator; } public void setUpdateable(boolean mutable) { @@ -284,12 +291,12 @@ public void setLazy(boolean lazy) { /** * Is this property lazy in the "bytecode" sense? - * + *
* Lazy here means whether we should push *something* to the entity * instance for this field in its "base fetch group". Mainly it affects * whether we should list this property's columns in the SQL select * for the owning entity when we load its "base fetch group". - * + *
* The "something" we push varies based on the nature (basic, etc) of
* the property.
*
@@ -441,6 +448,11 @@ public void setReturnedClassName(String returnedClassName) {
this.returnedClassName = returnedClassName;
}
+ public Generator createGenerator(RuntimeModelCreationContext context) {
+ return generatorCreator == null ? null :
+ generatorCreator.createGenerator( new PropertyGeneratorCreationContext( context ) );
+ }
+
public Property copy() {
final Property prop = new Property();
prop.setName( getName() );
@@ -450,7 +462,7 @@ public Property copy() {
prop.setInsertable( isInsertable() );
prop.setSelectable( isSelectable() );
prop.setOptimisticLocked( isOptimisticLocked() );
- prop.setValueGenerationStrategy( getValueGenerationStrategy() );
+ prop.setValueGeneratorCreator( getValueGeneratorCreator() );
prop.setPropertyAccessorName( getPropertyAccessorName() );
prop.setPropertyAccessStrategy( getPropertyAccessStrategy() );
prop.setLazy( isLazy() );
@@ -464,4 +476,42 @@ public Property copy() {
prop.setReturnedClassName( getReturnedClassName() );
return prop;
}
+
+ private class PropertyGeneratorCreationContext implements GeneratorCreationContext {
+ private final RuntimeModelCreationContext context;
+
+ public PropertyGeneratorCreationContext(RuntimeModelCreationContext context) {
+ this.context = context;
+ }
+
+ @Override
+ public Database getDatabase() {
+ return context.getMetadata().getDatabase();
+ }
+
+ @Override
+ public ServiceRegistry getServiceRegistry() {
+ return context.getBootstrapContext().getServiceRegistry();
+ }
+
+ @Override
+ public String getDefaultCatalog() {
+ return context.getSessionFactory().getSessionFactoryOptions().getDefaultCatalog();
+ }
+
+ @Override
+ public String getDefaultSchema() {
+ return context.getSessionFactory().getSessionFactoryOptions().getDefaultSchema();
+ }
+
+ @Override
+ public PersistentClass getPersistentClass() {
+ return persistentClass;
+ }
+
+ @Override
+ public Property getProperty() {
+ return Property.this;
+ }
+ }
}
diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/PropertyGeneration.java b/hibernate-core/src/main/java/org/hibernate/mapping/PropertyGeneration.java
index 5e9073d78a..e0e74a1deb 100644
--- a/hibernate-core/src/main/java/org/hibernate/mapping/PropertyGeneration.java
+++ b/hibernate-core/src/main/java/org/hibernate/mapping/PropertyGeneration.java
@@ -5,6 +5,8 @@
* See the lgpl.txt file in the root directory or