This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit a5b37f1c7ee3672e2820590d410482a9d6642024 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sat Feb 14 12:53:06 2026 -0600 Refactor binders to support custom ID generator creation in SimpleValueBinder - Implement setCustomIdGeneratorCreator in SimpleValueBinder to handle custom ID generators via GrailsSequenceWrapper. - Refactor binders in grails-data-hibernate7 to follow the object injection pattern, using constructor injection for all binder dependencies. - Centralize binder instantiation and dependency management in GrailsDomainBinder. - Fix Table import in GrailsHibernatePersistentPropertySpec to resolve constructor mismatch failures. - Update unit tests to align with refactored binder constructors. --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 74 ++++++++++++++++++++-- .../cfg/domainbinding/binder/CollectionBinder.java | 34 +++++++++- .../binder/ComponentPropertyBinder.java | 52 ++++++++++----- .../CompositeIdentifierToManyToOneBinder.java | 32 +++++----- .../domainbinding/binder/GrailsPropertyBinder.java | 43 +++++++------ .../cfg/domainbinding/binder/ManyToOneBinder.java | 25 ++++---- .../cfg/domainbinding/binder/OneToOneBinder.java | 11 ++-- .../cfg/domainbinding/binder/SimpleIdBinder.java | 12 +++- .../domainbinding/binder/SimpleValueBinder.java | 56 ++++++++-------- .../cfg/domainbinding/binder/VersionBinder.java | 17 ++--- .../secondpass/CollectionSecondPassBinder.java | 46 +++++++++++--- .../domainbinding/util/NamingStrategyWrapper.java | 4 ++ .../GrailsHibernatePersistentPropertySpec.groovy | 7 +- .../CollectionSecondPassBinderSpec.groovy | 13 +++- .../ComponentPropertyBinderSpec.groovy | 15 ++++- .../domainbinding/ListSecondPassBinderSpec.groovy | 12 +++- .../domainbinding/MapSecondPassBinderSpec.groovy | 13 +++- .../cfg/domainbinding/SimpleValueBinderSpec.groovy | 6 +- .../cfg/domainbinding/VersionBinderSpec.groovy | 1 + 19 files changed, 337 insertions(+), 136 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index e22d885664..8f61097728 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -31,17 +31,25 @@ import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyProvider; import org.grails.orm.hibernate.cfg.domainbinding.util.BasicValueIdCreator; import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.IdentityBinder; +import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder; +import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneValuesBinder; +import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder; +import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.NaturalIdentifierBinder; +import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueColumnBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder; +import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder; import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder; import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder; import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover; +import org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator; import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyWrapper; import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator; +import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher; import org.checkerframework.checker.nullness.qual.NonNull; @@ -188,14 +196,68 @@ public class GrailsDomainBinder , rootMappingDefaults ); this.backticksRemover = new BackticksRemover(); - this.defaultColumnNameFetcher = new DefaultColumnNameFetcher(getNamingStrategy(), backticksRemover); - this.collectionBinder = new CollectionBinder(metadataBuildingContext, this, getNamingStrategy()); - this.componentPropertyBinder = new ComponentPropertyBinder(metadataBuildingContext, getNamingStrategy(), getMappingCacheHolder(), getCollectionHolder(), enumTypeBinder, collectionBinder, propertyFromValueCreator); - this.grailsPropertyBinder = new GrailsPropertyBinder(metadataBuildingContext, getNamingStrategy(), getCollectionHolder(), enumTypeBinder, componentPropertyBinder, collectionBinder, propertyFromValueCreator); + PersistentEntityNamingStrategy namingStrategy = getNamingStrategy(); + JdbcEnvironment jdbcEnvironment = getJdbcEnvironment(); + this.defaultColumnNameFetcher = new DefaultColumnNameFetcher(namingStrategy, backticksRemover); + ColumnNameForPropertyAndPathFetcher columnNameForPropertyAndPathFetcher = new ColumnNameForPropertyAndPathFetcher(namingStrategy, defaultColumnNameFetcher, backticksRemover); + SimpleValueBinder simpleValueBinder = new SimpleValueBinder(namingStrategy, jdbcEnvironment); + EnumTypeBinder enumTypeBinderToUse = enumTypeBinder != null ? enumTypeBinder : new EnumTypeBinder(); + SimpleValueColumnFetcher simpleValueColumnFetcher = new SimpleValueColumnFetcher(); + CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder( + new org.grails.orm.hibernate.cfg.domainbinding.util.ForeignKeyColumnCountCalculator(), + new TableNameFetcher(namingStrategy), + namingStrategy, + defaultColumnNameFetcher, + backticksRemover, + simpleValueBinder + ); + OneToOneBinder oneToOneBinder = new OneToOneBinder(namingStrategy, simpleValueBinder); + ManyToOneBinder manyToOneBinder = new ManyToOneBinder(namingStrategy, simpleValueBinder, new ManyToOneValuesBinder(), compositeIdentifierToManyToOneBinder, simpleValueColumnFetcher); + + this.collectionBinder = new CollectionBinder( + metadataBuildingContext, + this, + namingStrategy, + jdbcEnvironment, + simpleValueBinder, + enumTypeBinderToUse, + manyToOneBinder, + compositeIdentifierToManyToOneBinder, + simpleValueColumnFetcher + ); + this.componentPropertyBinder = new ComponentPropertyBinder( + metadataBuildingContext, + namingStrategy, + jdbcEnvironment, + getMappingCacheHolder(), + getCollectionHolder(), + enumTypeBinderToUse, + collectionBinder, + propertyFromValueCreator, + null, + simpleValueBinder, + oneToOneBinder, + manyToOneBinder, + columnNameForPropertyAndPathFetcher + ); + this.grailsPropertyBinder = new GrailsPropertyBinder( + metadataBuildingContext, + namingStrategy, + getCollectionHolder(), + enumTypeBinderToUse, + componentPropertyBinder, + collectionBinder, + simpleValueBinder, + columnNameForPropertyAndPathFetcher, + oneToOneBinder, + manyToOneBinder, + propertyFromValueCreator + ); this.compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder); - SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, getNamingStrategy(), getJdbcEnvironment(), new BasicValueIdCreator(getJdbcEnvironment())); + PropertyBinder propertyBinder = new PropertyBinder(); + SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinder); this.identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder); - this.versionBinder = new VersionBinder(metadataBuildingContext, getNamingStrategy()); + this.versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinder, BasicValue::new); hibernateMappingContext .getHibernatePersistentEntities(dataSourceName) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CollectionBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CollectionBinder.java index bc10354bb4..7fdd21fd7a 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CollectionBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CollectionBinder.java @@ -12,6 +12,7 @@ import org.grails.orm.hibernate.cfg.PropertyConfig; import org.grails.orm.hibernate.cfg.JoinTable; import org.grails.orm.hibernate.cfg.domainbinding.util.CascadeBehavior; import org.grails.orm.hibernate.cfg.domainbinding.util.NamespaceNameExtractor; +import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.TableForManyCalculator; import org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder; import org.grails.orm.hibernate.cfg.domainbinding.secondpass.ListSecondPass; @@ -23,6 +24,7 @@ import org.grails.orm.hibernate.cfg.domainbinding.secondpass.SetSecondPass; import org.hibernate.FetchMode; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.Collection; import org.hibernate.mapping.OneToMany; import org.hibernate.mapping.PersistentClass; @@ -44,14 +46,40 @@ public class CollectionBinder { private final CollectionSecondPassBinder collectionSecondPassBinder; private final MapSecondPassBinder mapSecondPassBinder; - public CollectionBinder(MetadataBuildingContext metadataBuildingContext, GrailsDomainBinder grailsDomainBinder, PersistentEntityNamingStrategy namingStrategy) { + public CollectionBinder( + MetadataBuildingContext metadataBuildingContext, + GrailsDomainBinder grailsDomainBinder, + PersistentEntityNamingStrategy namingStrategy, + JdbcEnvironment jdbcEnvironment, + SimpleValueBinder simpleValueBinder, + EnumTypeBinder enumTypeBinder, + ManyToOneBinder manyToOneBinder, + CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder, + SimpleValueColumnFetcher simpleValueColumnFetcher) { this.metadataBuildingContext = metadataBuildingContext; this.grailsDomainBinder = grailsDomainBinder; this.namingStrategy = namingStrategy; - this.collectionSecondPassBinder = new CollectionSecondPassBinder(metadataBuildingContext, namingStrategy); - this.listSecondPassBinder = new ListSecondPassBinder(metadataBuildingContext, namingStrategy,collectionSecondPassBinder); + this.collectionSecondPassBinder = new CollectionSecondPassBinder( + metadataBuildingContext, + namingStrategy, + jdbcEnvironment, + simpleValueBinder, + enumTypeBinder, + manyToOneBinder, + compositeIdentifierToManyToOneBinder, + simpleValueColumnFetcher + ); + this.listSecondPassBinder = new ListSecondPassBinder(metadataBuildingContext, namingStrategy, collectionSecondPassBinder); this.mapSecondPassBinder = new MapSecondPassBinder(metadataBuildingContext, namingStrategy, collectionSecondPassBinder); + } + public CollectionBinder(MetadataBuildingContext metadataBuildingContext, GrailsDomainBinder grailsDomainBinder, PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this(metadataBuildingContext, grailsDomainBinder, namingStrategy, jdbcEnvironment, + new SimpleValueBinder(namingStrategy, jdbcEnvironment), + new EnumTypeBinder(), + new ManyToOneBinder(namingStrategy, jdbcEnvironment), + new CompositeIdentifierToManyToOneBinder(namingStrategy, jdbcEnvironment), + new SimpleValueColumnFetcher()); } /** diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java index aae8a3b8a6..5a9fbde104 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentPropertyBinder.java @@ -4,6 +4,7 @@ import java.util.Iterator; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.BasicValue; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Column; @@ -40,36 +41,50 @@ public class ComponentPropertyBinder { private final MetadataBuildingContext metadataBuildingContext; private final PersistentEntityNamingStrategy namingStrategy; + private final JdbcEnvironment jdbcEnvironment; private final MappingCacheHolder mappingCacheHolder; private final CollectionHolder collectionHolder; private final EnumTypeBinder enumTypeBinder; private final CollectionBinder collectionBinder; private final PropertyFromValueCreator propertyFromValueCreator; + private final ManyToOneBinder manyToOneBinder; + private final OneToOneBinder oneToOneBinder; + private final ColumnNameForPropertyAndPathFetcher columnNameForPropertyAndPathFetcher; private final SimpleValueBinder simpleValueBinder; private final ComponentBinder componentBinder; public ComponentPropertyBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, + JdbcEnvironment jdbcEnvironment, MappingCacheHolder mappingCacheHolder, CollectionHolder collectionHolder, EnumTypeBinder enumTypeBinder, CollectionBinder collectionBinder, PropertyFromValueCreator propertyFromValueCreator) { - this(metadataBuildingContext, namingStrategy, mappingCacheHolder, collectionHolder, - enumTypeBinder, collectionBinder, propertyFromValueCreator, null, new SimpleValueBinder(namingStrategy)); + this(metadataBuildingContext, namingStrategy, jdbcEnvironment, mappingCacheHolder, collectionHolder, + enumTypeBinder, collectionBinder, propertyFromValueCreator, null, + new SimpleValueBinder(namingStrategy, jdbcEnvironment), + new OneToOneBinder(namingStrategy, jdbcEnvironment), + new ManyToOneBinder(namingStrategy, jdbcEnvironment), + new ColumnNameForPropertyAndPathFetcher(namingStrategy, new DefaultColumnNameFetcher(namingStrategy), new BackticksRemover())); } - protected ComponentPropertyBinder(MetadataBuildingContext metadataBuildingContext, - PersistentEntityNamingStrategy namingStrategy, - MappingCacheHolder mappingCacheHolder, - CollectionHolder collectionHolder, - EnumTypeBinder enumTypeBinder, - CollectionBinder collectionBinder, - PropertyFromValueCreator propertyFromValueCreator, - ComponentBinder componentBinder, - SimpleValueBinder simpleValueBinder) { + public ComponentPropertyBinder(MetadataBuildingContext metadataBuildingContext, + PersistentEntityNamingStrategy namingStrategy, + JdbcEnvironment jdbcEnvironment, + MappingCacheHolder mappingCacheHolder, + CollectionHolder collectionHolder, + EnumTypeBinder enumTypeBinder, + CollectionBinder collectionBinder, + PropertyFromValueCreator propertyFromValueCreator, + ComponentBinder componentBinder, + SimpleValueBinder simpleValueBinder, + OneToOneBinder oneToOneBinder, + ManyToOneBinder manyToOneBinder, + ColumnNameForPropertyAndPathFetcher columnNameForPropertyAndPathFetcher) { this.metadataBuildingContext = metadataBuildingContext; this.namingStrategy = namingStrategy; + this.jdbcEnvironment = jdbcEnvironment; this.mappingCacheHolder = mappingCacheHolder; this.collectionHolder = collectionHolder; this.enumTypeBinder = enumTypeBinder; @@ -77,11 +92,15 @@ public class ComponentPropertyBinder { this.propertyFromValueCreator = propertyFromValueCreator; this.componentBinder = componentBinder != null ? componentBinder : new ComponentBinder(mappingCacheHolder, this); this.simpleValueBinder = simpleValueBinder; + this.oneToOneBinder = oneToOneBinder; + this.manyToOneBinder = manyToOneBinder; + this.columnNameForPropertyAndPathFetcher = columnNameForPropertyAndPathFetcher; } protected ComponentPropertyBinder() { this.metadataBuildingContext = null; this.namingStrategy = null; + this.jdbcEnvironment = null; this.mappingCacheHolder = null; this.collectionHolder = null; this.enumTypeBinder = null; @@ -89,6 +108,9 @@ public class ComponentPropertyBinder { this.propertyFromValueCreator = null; this.componentBinder = null; this.simpleValueBinder = null; + this.manyToOneBinder = null; + this.oneToOneBinder = null; + this.columnNameForPropertyAndPathFetcher = null; } public void bindComponentProperty(Component component, @@ -115,18 +137,18 @@ public class ComponentPropertyBinder { LOG.debug("[GrailsDomainBinder] Binding property [" + currentGrailsProp.getName() + "] as ManyToOne"); value = new ManyToOne(metadataBuildingContext, table); - new ManyToOneBinder(namingStrategy).bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path); + manyToOneBinder.bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path); } else if (currentGrailsProp instanceof org.grails.datastore.mapping.model.types.OneToOne association) { if (LOG.isDebugEnabled()) LOG.debug("[GrailsDomainBinder] Binding property [" + currentGrailsProp.getName() + "] as OneToOne"); if (association.canBindOneToOneWithSingleColumnAndForeignKey()) { value = new OneToOne(metadataBuildingContext, table, persistentClass); - new OneToOneBinder(namingStrategy).bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne) currentGrailsProp, (OneToOne) value, path); + oneToOneBinder.bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne) currentGrailsProp, (OneToOne) value, path); } else { value = new ManyToOne(metadataBuildingContext, table); - new ManyToOneBinder(namingStrategy).bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path); + manyToOneBinder.bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path); } } else if (currentGrailsProp instanceof HibernateEmbeddedProperty embedded) { @@ -139,7 +161,7 @@ public class ComponentPropertyBinder { value = new BasicValue(metadataBuildingContext, table); if (currentGrailsProp.getType().isEnum()) { - String columnName = new ColumnNameForPropertyAndPathFetcher(namingStrategy, new DefaultColumnNameFetcher(namingStrategy), new BackticksRemover()).getColumnNameForPropertyAndPath(currentGrailsProp, path, null); + String columnName = columnNameForPropertyAndPathFetcher.getColumnNameForPropertyAndPath(currentGrailsProp, path, null); enumTypeBinder.bindEnumType(currentGrailsProp, currentGrailsProp.getType(), (SimpleValue) value, columnName); } else { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java index 473842ad27..28c36e70d3 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdentifierToManyToOneBinder.java @@ -2,6 +2,7 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import java.util.List; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.SimpleValue; import org.grails.datastore.mapping.model.PersistentEntity; @@ -27,21 +28,13 @@ public class CompositeIdentifierToManyToOneBinder { private final BackticksRemover backticksRemover; private final SimpleValueBinder simpleValueBinder; - public CompositeIdentifierToManyToOneBinder(PersistentEntityNamingStrategy namingStrategy){ - this.foreignKeyColumnCountCalculator = new ForeignKeyColumnCountCalculator(); - this.tableNameFetcher = new TableNameFetcher(namingStrategy); - this.namingStrategy = namingStrategy; - this.defaultColumnNameFetcher = new DefaultColumnNameFetcher(namingStrategy); - this.backticksRemover = new BackticksRemover(); - this.simpleValueBinder = new SimpleValueBinder(namingStrategy); - - } - - protected CompositeIdentifierToManyToOneBinder(ForeignKeyColumnCountCalculator foreignKeyColumnCountCalculator - , TableNameFetcher tableNameFetcher - , PersistentEntityNamingStrategy namingStrategy - , DefaultColumnNameFetcher defaultColumnNameFetcher - , BackticksRemover backticksRemover, SimpleValueBinder simpleValueBinder) { + public CompositeIdentifierToManyToOneBinder( + ForeignKeyColumnCountCalculator foreignKeyColumnCountCalculator, + TableNameFetcher tableNameFetcher, + PersistentEntityNamingStrategy namingStrategy, + DefaultColumnNameFetcher defaultColumnNameFetcher, + BackticksRemover backticksRemover, + SimpleValueBinder simpleValueBinder) { this.foreignKeyColumnCountCalculator = foreignKeyColumnCountCalculator; this.tableNameFetcher =tableNameFetcher; this.namingStrategy = namingStrategy; @@ -50,6 +43,15 @@ public class CompositeIdentifierToManyToOneBinder { this.simpleValueBinder = simpleValueBinder; } + public CompositeIdentifierToManyToOneBinder(PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment){ + this(new ForeignKeyColumnCountCalculator(), + new TableNameFetcher(namingStrategy), + namingStrategy, + new DefaultColumnNameFetcher(namingStrategy), + new BackticksRemover(), + new SimpleValueBinder(namingStrategy, jdbcEnvironment)); + } + public void bindCompositeIdentifierToManyToOne(GrailsHibernatePersistentProperty property, SimpleValue value, CompositeIdentity compositeId, diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java index 69d65039c1..0c407946db 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java @@ -14,6 +14,7 @@ import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolde import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover; +import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyWrapper; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; @@ -47,27 +48,6 @@ public class GrailsPropertyBinder { private final PropertyFromValueCreator propertyFromValueCreator; public GrailsPropertyBinder( - MetadataBuildingContext metadataBuildingContext, - PersistentEntityNamingStrategy namingStrategy, - CollectionHolder collectionHolder, - EnumTypeBinder enumTypeBinder, - ComponentPropertyBinder componentPropertyBinder, - CollectionBinder collectionBinder, - PropertyFromValueCreator propertyFromValueCreator) { - this(metadataBuildingContext, - namingStrategy, - collectionHolder, - enumTypeBinder, - componentPropertyBinder, - collectionBinder, - new SimpleValueBinder(namingStrategy), - new ColumnNameForPropertyAndPathFetcher(namingStrategy, new DefaultColumnNameFetcher(namingStrategy), new BackticksRemover()), - new OneToOneBinder(namingStrategy), - new ManyToOneBinder(namingStrategy), - propertyFromValueCreator); - } - - protected GrailsPropertyBinder( MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, CollectionHolder collectionHolder, @@ -91,6 +71,27 @@ public class GrailsPropertyBinder { this.propertyFromValueCreator = propertyFromValueCreator; } + public GrailsPropertyBinder( + MetadataBuildingContext metadataBuildingContext, + PersistentEntityNamingStrategy namingStrategy, + CollectionHolder collectionHolder, + EnumTypeBinder enumTypeBinder, + ComponentPropertyBinder componentPropertyBinder, + CollectionBinder collectionBinder, + PropertyFromValueCreator propertyFromValueCreator) { + this(metadataBuildingContext, + namingStrategy, + collectionHolder, + enumTypeBinder, + componentPropertyBinder, + collectionBinder, + new SimpleValueBinder(namingStrategy, ((NamingStrategyWrapper)namingStrategy).getJdbcEnvironment()), + new ColumnNameForPropertyAndPathFetcher(namingStrategy, new DefaultColumnNameFetcher(namingStrategy), new BackticksRemover()), + new OneToOneBinder(namingStrategy, ((NamingStrategyWrapper)namingStrategy).getJdbcEnvironment()), + new ManyToOneBinder(namingStrategy, ((NamingStrategyWrapper)namingStrategy).getJdbcEnvironment()), + propertyFromValueCreator); + } + public Value bindProperty(PersistentClass persistentClass , @Nonnull GrailsHibernatePersistentProperty currentGrailsProp , @Nonnull InFlightMetadataCollector mappings diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java index 48f654ec6c..8fbf2521c2 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ManyToOneBinder.java @@ -1,6 +1,7 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import org.hibernate.MappingException; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.Column; import org.hibernate.mapping.ManyToOne; @@ -28,19 +29,11 @@ public class ManyToOneBinder { private final CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder; private final SimpleValueColumnFetcher simpleValueColumnFetcher; - public ManyToOneBinder(PersistentEntityNamingStrategy namingStrategy) { - this.namingStrategy = namingStrategy; - this.simpleValueBinder = new SimpleValueBinder(namingStrategy); - this.manyToOneValuesBinder = new ManyToOneValuesBinder(); - this.compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(namingStrategy); - this.simpleValueColumnFetcher = new SimpleValueColumnFetcher(); - } - - protected ManyToOneBinder(PersistentEntityNamingStrategy namingStrategy + public ManyToOneBinder(PersistentEntityNamingStrategy namingStrategy , SimpleValueBinder simpleValueBinder - , ManyToOneValuesBinder manyToOneValuesBinder - , CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder - , SimpleValueColumnFetcher simpleValueColumnFetcher) { + , ManyToOneValuesBinder manyToOneValuesBinder + , CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder + , SimpleValueColumnFetcher simpleValueColumnFetcher) { this.namingStrategy = namingStrategy; this.simpleValueBinder =simpleValueBinder; this.manyToOneValuesBinder = manyToOneValuesBinder; @@ -48,6 +41,14 @@ public class ManyToOneBinder { this.simpleValueColumnFetcher = simpleValueColumnFetcher; } + public ManyToOneBinder(PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this(namingStrategy, + new SimpleValueBinder(namingStrategy, jdbcEnvironment), + new ManyToOneValuesBinder(), + new CompositeIdentifierToManyToOneBinder(namingStrategy, jdbcEnvironment), + new SimpleValueColumnFetcher()); + } + /** * Binds a many-to-one relationship to the diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java index 853bafbe45..bc1109d7e6 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/OneToOneBinder.java @@ -1,6 +1,7 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import org.hibernate.FetchMode; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.OneToOne; import org.hibernate.type.ForeignKeyDirection; @@ -14,15 +15,13 @@ public class OneToOneBinder { private final PersistentEntityNamingStrategy namingStrategy; private final SimpleValueBinder simpleValueBinder; - public OneToOneBinder(PersistentEntityNamingStrategy namingStrategy) { + public OneToOneBinder(PersistentEntityNamingStrategy namingStrategy, SimpleValueBinder simpleValueBinder) { this.namingStrategy = namingStrategy; - this.simpleValueBinder = new SimpleValueBinder(namingStrategy); + this.simpleValueBinder = simpleValueBinder; } - protected OneToOneBinder(PersistentEntityNamingStrategy namingStrategy, - SimpleValueBinder simpleValueBinder) { - this.namingStrategy = namingStrategy; - this.simpleValueBinder = simpleValueBinder; + public OneToOneBinder(PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this(namingStrategy, new SimpleValueBinder(namingStrategy, jdbcEnvironment)); } public void bindOneToOne(final org.grails.datastore.mapping.model.types.OneToOne property, OneToOne oneToOne, diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java index 2d7a664297..46cba4a6f5 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleIdBinder.java @@ -28,11 +28,17 @@ public class SimpleIdBinder { private final PropertyBinder propertyBinder; private final BasicValueIdCreator basicValueIdCreator; - public SimpleIdBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment, BasicValueIdCreator basicValueIdCreator) { + public SimpleIdBinder( + MetadataBuildingContext metadataBuildingContext, + PersistentEntityNamingStrategy namingStrategy, + JdbcEnvironment jdbcEnvironment, + BasicValueIdCreator basicValueIdCreator, + SimpleValueBinder simpleValueBinder, + PropertyBinder propertyBinder) { this.metadataBuildingContext = metadataBuildingContext; this.jdbcEnvironment = jdbcEnvironment; - this.simpleValueBinder = new SimpleValueBinder(namingStrategy); - this.propertyBinder = new PropertyBinder(); + this.simpleValueBinder = simpleValueBinder; + this.propertyBinder = propertyBinder; this.basicValueIdCreator = basicValueIdCreator; } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java index d9b365e587..dcdb8b47ae 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/SimpleValueBinder.java @@ -4,6 +4,8 @@ import java.util.Optional; import java.util.Properties; import org.hibernate.id.enhanced.SequenceStyleGenerator; +import org.hibernate.generator.Generator; +import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.mapping.BasicValue; import org.hibernate.mapping.Column; import org.hibernate.mapping.DependantValue; @@ -19,32 +21,40 @@ import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.PropertyConfig; import org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenceGeneratorEnum; +import org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenceWrapper; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class SimpleValueBinder { private final PersistentEntityNamingStrategy namingStrategy; private final ColumnConfigToColumnBinder columnConfigToColumnBinder; private final ColumnBinder columnBinder; + private final JdbcEnvironment jdbcEnvironment; + private final GrailsSequenceWrapper grailsSequenceWrapper; private static final String SEQUENCE_KEY = GrailsSequenceGeneratorEnum.SEQUENCE.toString(); - /** - * Convenience constructor for namingStrategy. - */ - public SimpleValueBinder(PersistentEntityNamingStrategy namingStrategy) { - this(namingStrategy, new ColumnConfigToColumnBinder(), new ColumnBinder(namingStrategy)); - } - /** * Public constructor that accepts all collaborators. */ public SimpleValueBinder( PersistentEntityNamingStrategy namingStrategy, ColumnConfigToColumnBinder columnConfigToColumnBinder, - ColumnBinder columnBinder) { + ColumnBinder columnBinder, + JdbcEnvironment jdbcEnvironment, + GrailsSequenceWrapper grailsSequenceWrapper) { this.namingStrategy = namingStrategy; this.columnConfigToColumnBinder = columnConfigToColumnBinder; this.columnBinder = columnBinder; + this.jdbcEnvironment = jdbcEnvironment; + this.grailsSequenceWrapper = grailsSequenceWrapper; + } + + /** + * Convenience constructor for namingStrategy. + */ + public SimpleValueBinder(PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this(namingStrategy, new ColumnConfigToColumnBinder(), new ColumnBinder(namingStrategy), jdbcEnvironment, new GrailsSequenceWrapper()); } /** @@ -54,6 +64,8 @@ public class SimpleValueBinder { this.namingStrategy = null; this.columnConfigToColumnBinder = null; this.columnBinder = null; + this.jdbcEnvironment = null; + this.grailsSequenceWrapper = null; } public void bindSimpleValue( @@ -68,29 +80,7 @@ public class SimpleValueBinder { String generator = propertyConfig.getGenerator(); if (generator != null && simpleValue instanceof BasicValue basicValue) { - Properties params = propertyConfig.getTypeParams(); - final Properties generatorProps = new Properties(); - if (params != null) { - generatorProps.putAll(params); - } - - if (SEQUENCE_KEY.equals(generator) && generatorProps.containsKey(SEQUENCE_KEY)) { - generatorProps.put(SequenceStyleGenerator.SEQUENCE_PARAM, generatorProps.getProperty(SEQUENCE_KEY)); - } - - if (GrailsSequenceGeneratorEnum.IDENTITY.toString().equals(generator)) { - basicValue.setCustomIdGeneratorCreator(context -> { - var gen = new org.hibernate.id.IdentityGenerator(); - context.getProperty().getValue().getColumns().get(0).setIdentity(true); - return gen; - }); - } else if (GrailsSequenceGeneratorEnum.SEQUENCE.toString().equals(generator) || GrailsSequenceGeneratorEnum.SEQUENCE_IDENTITY.toString().equals(generator)) { - basicValue.setCustomIdGeneratorCreator(context -> { - var gen = new org.hibernate.id.enhanced.SequenceStyleGenerator(); - gen.configure(context.getType(), generatorProps, context.getServiceRegistry()); - return gen; - }); - } + basicValue.setCustomIdGeneratorCreator(context -> createGenerator(property, context, generator)); } if (propertyConfig.isDerived() && !(property instanceof TenantId)) { @@ -118,4 +108,8 @@ public class SimpleValueBinder { } } + private Generator createGenerator(GrailsHibernatePersistentProperty property, GeneratorCreationContext context, String generatorName) { + return grailsSequenceWrapper.getGenerator(generatorName, context, null, (GrailsHibernatePersistentEntity) property.getHibernateOwner(), jdbcEnvironment); + } + } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/VersionBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/VersionBinder.java index cf8858b21f..45b3a08a91 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/VersionBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/VersionBinder.java @@ -2,6 +2,7 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.engine.OptimisticLockStyle; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.BasicValue; import org.hibernate.mapping.Property; import org.hibernate.mapping.RootClass; @@ -21,14 +22,7 @@ public class VersionBinder { private final PropertyBinder propertyBinder; private final BiFunction<MetadataBuildingContext, Table, BasicValue> basicValueFactory; - public VersionBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy) { - this(metadataBuildingContext, - new SimpleValueBinder(namingStrategy), - new PropertyBinder(), - BasicValue::new); - } - - protected VersionBinder(MetadataBuildingContext metadataBuildingContext, + public VersionBinder(MetadataBuildingContext metadataBuildingContext, SimpleValueBinder simpleValueBinder, PropertyBinder propertyBinder, BiFunction<MetadataBuildingContext, Table, BasicValue> basicValueFactory) { @@ -38,6 +32,13 @@ public class VersionBinder { this.basicValueFactory = basicValueFactory; } + public VersionBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this(metadataBuildingContext, + new SimpleValueBinder(namingStrategy, jdbcEnvironment), + new PropertyBinder(), + BasicValue::new); + } + public void bindVersion(GrailsHibernatePersistentProperty version, RootClass entity) { if (version != null) { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java index 779dd7b8e4..b2e1ee3785 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/CollectionSecondPassBinder.java @@ -26,6 +26,7 @@ import org.hibernate.FetchMode; import org.hibernate.MappingException; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.*; import org.hibernate.mapping.Collection; import org.hibernate.type.Type; @@ -47,16 +48,45 @@ public class CollectionSecondPassBinder { private final MetadataBuildingContext metadataBuildingContext; private final PersistentEntityNamingStrategy namingStrategy; + private final JdbcEnvironment jdbcEnvironment; private final DefaultColumnNameFetcher defaultColumnNameFetcher; private final OrderByClauseBuilder orderByClauseBuilder; - - public CollectionSecondPassBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy) { + private final SimpleValueBinder simpleValueBinder; + private final EnumTypeBinder enumTypeBinder; + private final ManyToOneBinder manyToOneBinder; + private final CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder; + private final SimpleValueColumnFetcher simpleValueColumnFetcher; + + public CollectionSecondPassBinder( + MetadataBuildingContext metadataBuildingContext, + PersistentEntityNamingStrategy namingStrategy, + JdbcEnvironment jdbcEnvironment, + SimpleValueBinder simpleValueBinder, + EnumTypeBinder enumTypeBinder, + ManyToOneBinder manyToOneBinder, + CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder, + SimpleValueColumnFetcher simpleValueColumnFetcher) { this.metadataBuildingContext = metadataBuildingContext; this.namingStrategy = namingStrategy; + this.jdbcEnvironment = jdbcEnvironment; + this.simpleValueBinder = simpleValueBinder; + this.enumTypeBinder = enumTypeBinder; + this.manyToOneBinder = manyToOneBinder; + this.compositeIdentifierToManyToOneBinder = compositeIdentifierToManyToOneBinder; + this.simpleValueColumnFetcher = simpleValueColumnFetcher; this.defaultColumnNameFetcher = new DefaultColumnNameFetcher(namingStrategy); this.orderByClauseBuilder = new OrderByClauseBuilder(); } + public CollectionSecondPassBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this(metadataBuildingContext, namingStrategy, jdbcEnvironment, + new SimpleValueBinder(namingStrategy, jdbcEnvironment), + new EnumTypeBinder(), + new ManyToOneBinder(namingStrategy, jdbcEnvironment), + new CompositeIdentifierToManyToOneBinder(namingStrategy, jdbcEnvironment), + new SimpleValueColumnFetcher()); + } + public void bindCollectionSecondPass(HibernateToManyProperty property, @Nonnull InFlightMetadataCollector mappings, java.util.Map<?, ?> persistentClasses, Collection collection, String sessionFactoryBeanName) { @@ -267,7 +297,7 @@ public class CollectionSecondPassBinder { } if (isEnum) { - new EnumTypeBinder().bindEnumType(property, referencedType, element, columnName); + enumTypeBinder.bindEnumType(property, referencedType, element, columnName); } else { @@ -290,7 +320,7 @@ public class CollectionSecondPassBinder { new SimpleValueColumnBinder().bindSimpleValue(element, typeName, columnName, true); if (joinColumnMappingOptional.isPresent()) { - Column column = new SimpleValueColumnFetcher().getColumnForSimpleValue(element); + Column column = simpleValueColumnFetcher.getColumnForSimpleValue(element); ColumnConfig columnConfig = joinColumnMappingOptional.get(); final PropertyConfig mappedForm = property.getMappedForm(); new ColumnConfigToColumnBinder().bindColumnConfigToColumn(column, columnConfig, mappedForm); @@ -305,7 +335,7 @@ public class CollectionSecondPassBinder { } if (m != null && m.hasCompositeIdentifier()) { CompositeIdentity ci = (CompositeIdentity) m.getIdentity(); - new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne(property, element, ci, domainClass, EMPTY_PATH); + compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne(property, element, ci, domainClass, EMPTY_PATH); } else { if (joinColumnMappingOptional.isPresent()) { @@ -343,7 +373,7 @@ public class CollectionSecondPassBinder { } private void bindManyToMany(Association property, ManyToOne element) { - new ManyToOneBinder(namingStrategy).bindManyToOne(property, element, EMPTY_PATH); + manyToOneBinder.bindManyToOne(property, element, EMPTY_PATH); element.setReferencedEntityName(property.getOwner().getName()); } @@ -359,11 +389,11 @@ public class CollectionSecondPassBinder { boolean hasCompositeIdentifier = mapping != null && mapping.hasCompositeIdentifier(); if (hasCompositeIdentifier && property.supportsJoinColumnMapping()) { CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity(); - new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne(property, key, ci, refDomainClass, EMPTY_PATH); + compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne(property, key, ci, refDomainClass, EMPTY_PATH); } else { // set type - new SimpleValueBinder(namingStrategy).bindSimpleValue(property, null, key, EMPTY_PATH); + simpleValueBinder.bindSimpleValue(property, null, key, EMPTY_PATH); } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyWrapper.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyWrapper.java index d898c896d2..ba21d57d14 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyWrapper.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/NamingStrategyWrapper.java @@ -35,6 +35,10 @@ public class NamingStrategyWrapper implements PersistentEntityNamingStrategy { this.jdbcEnvironment = jdbcEnvironment; } + public JdbcEnvironment getJdbcEnvironment() { + return jdbcEnvironment; + } + @Override public String resolveColumnName(String logicalName) { return Optional.ofNullable(logicalName) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentPropertySpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentPropertySpec.groovy index f8f4160070..646bfc6af7 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentPropertySpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentPropertySpec.groovy @@ -7,6 +7,7 @@ import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyWrapper import spock.lang.Unroll import org.hibernate.mapping.Property import org.hibernate.mapping.ManyToOne +import org.hibernate.mapping.Table class GrailsHibernatePersistentPropertySpec extends HibernateGormDatastoreSpec { @@ -158,7 +159,7 @@ class GrailsHibernatePersistentPropertySpec extends HibernateGormDatastoreSpec { given: def domainBinder = getGrailsDomainBinder() def metadataBuildingContext = domainBinder.getMetadataBuildingContext() - def table = metadataBuildingContext.getMetadataCollector().addTable(null, null, "TEST", null, false, metadataBuildingContext) + def table = new Table("TEST") PersistentEntity entity = createPersistentEntity(TestEntityWithTypeName) GrailsHibernatePersistentProperty property = (GrailsHibernatePersistentProperty) entity.getPropertyByName("name") @@ -173,7 +174,7 @@ class GrailsHibernatePersistentPropertySpec extends HibernateGormDatastoreSpec { given: def domainBinder = getGrailsDomainBinder() def metadataBuildingContext = domainBinder.getMetadataBuildingContext() - def table = metadataBuildingContext.getMetadataCollector().addTable(null, null, "TEST2", null, false, metadataBuildingContext) + def table = new Table("TEST2") PersistentEntity entity = createPersistentEntity(TestEntityWithEnum) GrailsHibernatePersistentProperty property = (GrailsHibernatePersistentProperty) entity.getPropertyByName("name") @@ -187,7 +188,7 @@ class GrailsHibernatePersistentPropertySpec extends HibernateGormDatastoreSpec { given: def domainBinder = getGrailsDomainBinder() def metadataBuildingContext = domainBinder.getMetadataBuildingContext() - def table = metadataBuildingContext.getMetadataCollector().addTable(null, null, "TEST3", null, false, metadataBuildingContext) + def table = new Table("TEST3") PersistentEntity entity = createPersistentEntity(BMTOWLMAuthor) GrailsHibernatePersistentProperty property = (GrailsHibernatePersistentProperty) entity.getPropertyByName("books") diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy index 9b418c57b0..e1df39f439 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionSecondPassBinderSpec.groovy @@ -23,7 +23,18 @@ class CollectionSecondPassBinderSpec extends HibernateGormDatastoreSpec { def collector = getCollector() def binder = getGrailsDomainBinder() def collectionBinder = binder.getCollectionBinder() - def collectionSecondPassBinder = new CollectionSecondPassBinder(binder.getMetadataBuildingContext(), binder.getNamingStrategy()) + def namingStrategy = binder.getNamingStrategy() + def jdbcEnvironment = binder.getJdbcEnvironment() + def collectionSecondPassBinder = new CollectionSecondPassBinder( + binder.getMetadataBuildingContext(), + namingStrategy, + jdbcEnvironment, + new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder(), + new org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher() + ) def authorEntity = getPersistentEntity(Author) as GrailsHibernatePersistentEntity def bookEntity = getPersistentEntity(Book) as GrailsHibernatePersistentEntity diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy index 7495a0d0e1..1189d3cfd1 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentPropertyBinderSpec.groovy @@ -21,7 +21,10 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentPropertyBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder +import org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder +import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder import org.hibernate.boot.spi.InFlightMetadataCollector import org.hibernate.mapping.BasicValue @@ -56,6 +59,9 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { CollectionBinder collectionBinder = Mock(CollectionBinder) PropertyFromValueCreator propertyFromValueCreator = Mock(PropertyFromValueCreator) ComponentBinder componentBinder = Mock(ComponentBinder) + OneToOneBinder oneToOneBinder = Mock(OneToOneBinder) + ManyToOneBinder manyToOneBinder = Mock(ManyToOneBinder) + ColumnNameForPropertyAndPathFetcher columnNameFetcher = Mock(ColumnNameForPropertyAndPathFetcher) @Subject ComponentPropertyBinder binder @@ -63,16 +69,22 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { def mockSimpleValueBinder = Mock(SimpleValueBinder) // Mock SimpleValueBinder def setup() { + def jdbcEnvironment = Mock(org.hibernate.engine.jdbc.env.spi.JdbcEnvironment) + binder = new ComponentPropertyBinder( getGrailsDomainBinder().getMetadataBuildingContext(), namingStrategy, + jdbcEnvironment, mappingCacheHolder, collectionHolder, enumTypeBinder, collectionBinder, propertyFromValueCreator, componentBinder, - mockSimpleValueBinder + mockSimpleValueBinder, + oneToOneBinder, + manyToOneBinder, + columnNameFetcher ) } @@ -215,6 +227,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { namingStrategy.resolveColumnName("type") >> "type_col" namingStrategy.resolveColumnName("address") >> "address" + columnNameFetcher.getColumnNameForPropertyAndPath(currentGrailsProp, "address", null) >> "address_type_col" propertyFromValueCreator.createProperty(_ as BasicValue, currentGrailsProp) >> hibernateProperty when: diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy index 58b545f466..f8ceee2d9b 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ListSecondPassBinderSpec.groovy @@ -25,8 +25,18 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { def collector = getCollector() def binder = getGrailsDomainBinder() def collectionBinder = binder.getCollectionBinder() - def collectionSecondPassBinder = new CollectionSecondPassBinder(binder.getMetadataBuildingContext(), binder.getNamingStrategy()) def namingStrategy = binder.getNamingStrategy() + def jdbcEnvironment = binder.getJdbcEnvironment() + def collectionSecondPassBinder = new CollectionSecondPassBinder( + binder.getMetadataBuildingContext(), + namingStrategy, + jdbcEnvironment, + new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder(), + new org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher() + ) def listSecondPassBinder = new ListSecondPassBinder(binder.getMetadataBuildingContext(),namingStrategy, collectionSecondPassBinder) def authorEntity = getPersistentEntity(ListBinderAuthor) as GrailsHibernatePersistentEntity diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy index ba759da156..e4eccb37c9 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/MapSecondPassBinderSpec.groovy @@ -25,7 +25,18 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { def collector = getCollector() def binder = getGrailsDomainBinder() def collectionBinder = binder.getCollectionBinder() - def collectionSecondPassBinder = new CollectionSecondPassBinder(binder.getMetadataBuildingContext(), binder.getNamingStrategy()) + def namingStrategy = binder.getNamingStrategy() + def jdbcEnvironment = binder.getJdbcEnvironment() + def collectionSecondPassBinder = new CollectionSecondPassBinder( + binder.getMetadataBuildingContext(), + namingStrategy, + jdbcEnvironment, + new org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleValueBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.binder.EnumTypeBinder(), + new org.grails.orm.hibernate.cfg.domainbinding.binder.ManyToOneBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToManyToOneBinder(namingStrategy, jdbcEnvironment), + new org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher() + ) def mapSecondPassBinder = new MapSecondPassBinder(binder.getMetadataBuildingContext(), binder.getNamingStrategy(), collectionSecondPassBinder) def authorEntity = getPersistentEntity(MapAuthorBinder) as GrailsHibernatePersistentEntity diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy index 4399d9087b..8943e11823 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy @@ -29,10 +29,14 @@ class SimpleValueBinderSpec extends Specification { def namingStrategy = Mock(PersistentEntityNamingStrategy) def columnConfigToColumnBinder = Mock(ColumnConfigToColumnBinder) def columnBinder = Mock(ColumnBinder) + def jdbcEnvironment = Mock(org.hibernate.engine.jdbc.env.spi.JdbcEnvironment) + def grailsSequenceWrapper = Mock(org.grails.orm.hibernate.cfg.domainbinding.generator.GrailsSequenceWrapper) def binder = new SimpleValueBinder(namingStrategy, columnConfigToColumnBinder, - columnBinder) + columnBinder, + jdbcEnvironment, + grailsSequenceWrapper) def "sets type from provider when present and applies type params"() { given: diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/VersionBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/VersionBinderSpec.groovy index 4e8c2ff408..8ea7cafb35 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/VersionBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/VersionBinderSpec.groovy @@ -32,6 +32,7 @@ class VersionBinderSpec extends HibernateGormDatastoreSpec { simpleValueBinder = Mock(SimpleValueBinder) propertyBinder = Spy(PropertyBinder) basicValueFactory = Mock(BiFunction) + def jdbcEnvironment = Mock(org.hibernate.engine.jdbc.env.spi.JdbcEnvironment) versionBinder = new VersionBinder(metadataBuildingContext, simpleValueBinder, propertyBinder, basicValueFactory) }
