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 72652d95a68201f820f2208e8a5b01c79f703fd2 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sun Feb 15 22:41:14 2026 -0600 Cleanup binder classes and resolve circular dependency - Remove unused fields and constructor parameters in ComponentPropertyBinder, ComponentBinder, and CompositeIdBinder. - Break circular dependency between ComponentPropertyBinder and ComponentBinder by using a setter for ComponentBinder. - Update GrailsDomainBinder to perform post-construction wiring of binders. - Align test suite with updated binder constructors and wiring. --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 11 +- .../cfg/domainbinding/binder/ComponentBinder.java | 11 +- .../binder/ComponentPropertyBinder.java | 48 +------- .../domainbinding/binder/CompositeIdBinder.java | 10 +- .../cfg/domainbinding/CollectionBinderSpec.groovy | 11 +- .../CollectionSecondPassBinderSpec.groovy | 116 ++++++-------------- .../cfg/domainbinding/ComponentBinderSpec.groovy | 4 +- .../ComponentPropertyBinderSpec.groovy | 18 +-- .../cfg/domainbinding/CompositeIdBinderSpec.groovy | 6 +- .../domainbinding/ListSecondPassBinderSpec.groovy | 121 ++++++--------------- .../domainbinding/MapSecondPassBinderSpec.groovy | 121 ++++++--------------- 11 files changed, 112 insertions(+), 365 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 13c914e79f..332fbac39a 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 @@ -187,21 +187,18 @@ public class GrailsDomainBinder ComponentUpdater componentUpdater = new ComponentUpdater(propertyFromValueCreator); ComponentPropertyBinder componentPropertyBinder = new ComponentPropertyBinder( metadataBuildingContext, - namingStrategy, - jdbcEnvironment, - getMappingCacheHolder(), collectionHolder, enumTypeBinder, collectionBinder, - propertyFromValueCreator, - null, simpleValueBinder, oneToOneBinder, manyToOneBinder, columnNameForPropertyAndPathFetcher, componentUpdater ); - ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, getMappingCacheHolder(), componentPropertyBinder, componentUpdater); + ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, getMappingCacheHolder(), componentPropertyBinder); + componentPropertyBinder.setComponentBinder(componentBinder); + GrailsPropertyBinder grailsPropertyBinder = new GrailsPropertyBinder( metadataBuildingContext, namingStrategy, @@ -215,7 +212,7 @@ public class GrailsDomainBinder manyToOneBinder, propertyFromValueCreator ); - CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, componentUpdater); + CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder); PropertyBinder propertyBinder = new PropertyBinder(); SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinder); IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java index 0ef76618be..753c1066c5 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ComponentBinder.java @@ -1,15 +1,10 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; -import java.util.Iterator; - import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; -import org.hibernate.mapping.Column; import org.hibernate.mapping.Component; import org.hibernate.mapping.PersistentClass; -import org.hibernate.mapping.Property; import org.hibernate.mapping.Table; -import org.hibernate.mapping.Value; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; @@ -17,7 +12,6 @@ import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.GrailsHibernateUtil; import org.grails.orm.hibernate.cfg.MappingCacheHolder; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateEmbeddedProperty; -import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator; import jakarta.annotation.Nonnull; @@ -26,13 +20,11 @@ public class ComponentBinder { private final MetadataBuildingContext metadataBuildingContext; private final MappingCacheHolder mappingCacheHolder; private final ComponentPropertyBinder componentPropertyBinder; - private final ComponentUpdater componentUpdater; - public ComponentBinder(MetadataBuildingContext metadataBuildingContext, MappingCacheHolder mappingCacheHolder, ComponentPropertyBinder componentPropertyBinder, ComponentUpdater componentUpdater) { + public ComponentBinder(MetadataBuildingContext metadataBuildingContext, MappingCacheHolder mappingCacheHolder, ComponentPropertyBinder componentPropertyBinder) { this.metadataBuildingContext = metadataBuildingContext; this.mappingCacheHolder = mappingCacheHolder; this.componentPropertyBinder = componentPropertyBinder; - this.componentUpdater = componentUpdater; } @@ -61,6 +53,7 @@ public class ComponentBinder { continue; } componentPropertyBinder.bindComponentProperty(component, property, currentGrailsProp, persistentClass, path, table, mappings); + } return component; } 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 75a25f3118..52f8222271 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 @@ -1,18 +1,13 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; -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; import org.hibernate.mapping.Component; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.OneToOne; import org.hibernate.mapping.PersistentClass; -import org.hibernate.mapping.Property; import org.hibernate.mapping.SimpleValue; import org.hibernate.mapping.Table; import org.hibernate.mapping.Value; @@ -20,18 +15,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.grails.datastore.mapping.model.types.Association; -import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateEmbeddedProperty; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty; -import org.grails.orm.hibernate.cfg.MappingCacheHolder; -import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; -import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator; import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder; import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionType; 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 jakarta.annotation.Nonnull; @@ -40,60 +29,29 @@ public class ComponentPropertyBinder { private static final Logger LOG = LoggerFactory.getLogger(ComponentPropertyBinder.class); 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; private final ComponentUpdater componentUpdater; + private ComponentBinder componentBinder; public ComponentPropertyBinder(MetadataBuildingContext metadataBuildingContext, - PersistentEntityNamingStrategy namingStrategy, - JdbcEnvironment jdbcEnvironment, - MappingCacheHolder mappingCacheHolder, - CollectionHolder collectionHolder, - EnumTypeBinder enumTypeBinder, - CollectionBinder collectionBinder, - PropertyFromValueCreator propertyFromValueCreator) { - 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()), - new ComponentUpdater(propertyFromValueCreator)); - } - - 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, ComponentUpdater componentUpdater) { this.metadataBuildingContext = metadataBuildingContext; - this.namingStrategy = namingStrategy; - this.jdbcEnvironment = jdbcEnvironment; - this.mappingCacheHolder = mappingCacheHolder; this.collectionHolder = collectionHolder; this.enumTypeBinder = enumTypeBinder; this.collectionBinder = collectionBinder; - this.propertyFromValueCreator = propertyFromValueCreator; - this.componentBinder = componentBinder != null ? componentBinder : new ComponentBinder(metadataBuildingContext, mappingCacheHolder, this, componentUpdater); this.simpleValueBinder = simpleValueBinder; this.oneToOneBinder = oneToOneBinder; this.manyToOneBinder = manyToOneBinder; @@ -101,7 +59,9 @@ public class ComponentPropertyBinder { this.componentUpdater = componentUpdater; } - + public void setComponentBinder(ComponentBinder componentBinder) { + this.componentBinder = componentBinder; + } public Value bindComponentProperty(Component component, GrailsHibernatePersistentProperty componentProperty, diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java index 3426fe5440..3dd7d6ae32 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/CompositeIdBinder.java @@ -1,21 +1,15 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; -import java.util.Iterator; - import org.hibernate.MappingException; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; -import org.hibernate.mapping.Column; import org.hibernate.mapping.Component; -import org.hibernate.mapping.Property; import org.hibernate.mapping.RootClass; -import org.hibernate.mapping.Value; import org.grails.orm.hibernate.cfg.CompositeIdentity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.GrailsHibernateUtil; -import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator; import jakarta.annotation.Nonnull; @@ -23,12 +17,10 @@ public class CompositeIdBinder { private final MetadataBuildingContext metadataBuildingContext; private final ComponentPropertyBinder componentPropertyBinder; - private final ComponentUpdater componentUpdater; - public CompositeIdBinder(MetadataBuildingContext metadataBuildingContext, ComponentPropertyBinder componentPropertyBinder, ComponentUpdater componentUpdater) { + public CompositeIdBinder(MetadataBuildingContext metadataBuildingContext, ComponentPropertyBinder componentPropertyBinder) { this.metadataBuildingContext = metadataBuildingContext; this.componentPropertyBinder = componentPropertyBinder; - this.componentUpdater = componentUpdater; } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy index cb1f99cfcb..c0628bbae4 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CollectionBinderSpec.groovy @@ -83,21 +83,18 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { ComponentUpdater componentUpdater = new ComponentUpdater(propertyFromValueCreator) ComponentPropertyBinder componentPropertyBinder = new ComponentPropertyBinder( metadataBuildingContext, - namingStrategy, - jdbcEnvironment, - binder.getMappingCacheHolder(), collectionHolder, enumTypeBinderToUse, collectionBinder, - propertyFromValueCreator, - null, simpleValueBinder, oneToOneBinder, manyToOneBinder, columnNameForPropertyAndPathFetcher, componentUpdater ) - ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder, componentUpdater) + ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder) + componentPropertyBinder.setComponentBinder(componentBinder) + GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder( metadataBuildingContext, namingStrategy, @@ -111,7 +108,7 @@ class CollectionBinderSpec extends HibernateGormDatastoreSpec { manyToOneBinder, propertyFromValueCreator ) - CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, componentUpdater) + CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) 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 d9b5356afe..90d81ffcab 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 @@ -1,15 +1,11 @@ package org.grails.orm.hibernate.cfg.domainbinding -import grails.gorm.annotation.Entity import grails.gorm.specs.HibernateGormDatastoreSpec import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity -import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty -import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover -import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher -import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder -import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher - +import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty +import org.hibernate.mapping.OneToMany import org.hibernate.mapping.RootClass +import org.hibernate.mapping.Set import org.hibernate.boot.spi.MetadataBuildingContext import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment @@ -21,10 +17,6 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToMa import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder -import org.grails.orm.hibernate.cfg.GrailsDomainBinder - -import org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder - import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder @@ -38,8 +30,13 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder -import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator import org.hibernate.mapping.BasicValue +import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover +import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher +import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher +import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder +import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator +import org.grails.orm.hibernate.cfg.GrailsDomainBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -85,21 +82,18 @@ class CollectionSecondPassBinderSpec extends HibernateGormDatastoreSpec { ComponentUpdater componentUpdater = new ComponentUpdater(propertyFromValueCreator) ComponentPropertyBinder componentPropertyBinder = new ComponentPropertyBinder( metadataBuildingContext, - namingStrategy, - jdbcEnvironment, - binder.getMappingCacheHolder(), collectionHolder, enumTypeBinderToUse, collectionBinder, - propertyFromValueCreator, - null, simpleValueBinder, oneToOneBinder, manyToOneBinder, columnNameForPropertyAndPathFetcher, componentUpdater ) - ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder, componentUpdater) + ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder) + componentPropertyBinder.setComponentBinder(componentBinder) + GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder( metadataBuildingContext, namingStrategy, @@ -113,7 +107,7 @@ class CollectionSecondPassBinderSpec extends HibernateGormDatastoreSpec { manyToOneBinder, propertyFromValueCreator ) - CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, componentUpdater) + CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) @@ -155,85 +149,37 @@ class CollectionSecondPassBinderSpec extends HibernateGormDatastoreSpec { binders.unionSubclassBinder as UnionSubclassBinder, binders.singleTableSubclassBinder as SingleTableSubclassBinder) } + void setupSpec() { manager.addAllDomainClasses([ - Author, - Book + org.apache.grails.data.testing.tck.domains.Pet, + org.apache.grails.data.testing.tck.domains.Person, + org.apache.grails.data.testing.tck.domains.PetType ]) } - void "Test bind collection second pass"() { + void "Test bind collection"() { given: - def collector = getCollector() def binder = getGrailsDomainBinder() - def binders = getBinders(binder) - def collectionBinder = binders.collectionBinder - 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 + def collectionBinder = getBinders(binder).collectionBinder + def collector = getCollector() - // Register referenced entity in Hibernate - bindRoot(binder, bookEntity, collector, "sessionFactory") + def personEntity = getPersistentEntity(org.apache.grails.data.testing.tck.domains.Person) as GrailsHibernatePersistentEntity + def petEntity = getPersistentEntity(org.apache.grails.data.testing.tck.domains.Pet) as GrailsHibernatePersistentEntity - // Manually create RootClass for the main entity def rootClass = new RootClass(binder.getMetadataBuildingContext()) - rootClass.setEntityName(authorEntity.name) - rootClass.setJpaEntityName(authorEntity.name) - rootClass.setTable(collector.addTable(null, null, "AUTHOR", null, false, binder.getMetadataBuildingContext())) - - // Add a primary key to avoid NPE - def pk = new org.hibernate.mapping.PrimaryKey(rootClass.table) - def idCol = new org.hibernate.mapping.Column("id") - rootClass.table.addColumn(idCol) - pk.addColumn(idCol) - rootClass.table.setPrimaryKey(pk) - collector.addEntityBinding(rootClass) - - def booksProp = authorEntity.getPropertyByName("books") as HibernateToManyProperty - def set = new org.hibernate.mapping.Set(binder.getMetadataBuildingContext(), rootClass) - set.setRole(authorEntity.name + ".books") - - // Initial first pass binding - collectionBinder.bindCollection(booksProp, set, rootClass, collector, "") - - // Prepare persistentClasses map - Map persistentClasses = [ - (authorEntity.name): rootClass, - (bookEntity.name): collector.getEntityBinding(bookEntity.name) - ] + rootClass.setEntityName(personEntity.name) + rootClass.setTable(collector.addTable(null, null, "PERSON", null, false, binder.getMetadataBuildingContext())) + + def petsProp = personEntity.getPropertyByName("pets") as GrailsHibernatePersistentProperty + def collection = new Set(binder.getMetadataBuildingContext(), rootClass) when: - collectionSecondPassBinder.bindCollectionSecondPass(booksProp, collector, persistentClasses, set) - collector.processSecondPasses(binder.getMetadataBuildingContext()) + collectionBinder.bindCollection(petsProp, collection, rootClass, collector, "") then: - set.key != null - set.element != null - set.collectionTable != null + collection.role == "${personEntity.name}.pets".toString() + collection.element instanceof OneToMany + (collection.element as OneToMany).referencedEntityName == petEntity.name } } - -@Entity -class Author { - Long id - Set<Book> books - static hasMany = [books: Book] -} - -@Entity -class Book { - Long id - String title -} diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy index a35d653d04..6bee48a1f6 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ComponentBinderSpec.groovy @@ -12,7 +12,6 @@ import spock.lang.Subject 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.ComponentUpdater import org.hibernate.mapping.Value import org.hibernate.mapping.Table @@ -20,13 +19,12 @@ class ComponentBinderSpec extends HibernateGormDatastoreSpec { MappingCacheHolder mappingCacheHolder = Mock(MappingCacheHolder) ComponentPropertyBinder componentPropertyBinder = Mock(ComponentPropertyBinder) - ComponentUpdater componentUpdater = Mock(ComponentUpdater) @Subject ComponentBinder binder def setup() { - binder = new ComponentBinder(getGrailsDomainBinder().getMetadataBuildingContext(), mappingCacheHolder, componentPropertyBinder, componentUpdater) + binder = new ComponentBinder(getGrailsDomainBinder().getMetadataBuildingContext(), mappingCacheHolder, componentPropertyBinder) } def "should bind component and its properties"() { 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 8ed981ff28..87e522ad36 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 @@ -67,25 +67,20 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { def mockSimpleValueBinder = Mock(SimpleValueBinder) // Mock SimpleValueBinder def setup() { - def jdbcEnvironment = Mock(org.hibernate.engine.jdbc.env.spi.JdbcEnvironment) componentUpdater = new ComponentUpdater(propertyFromValueCreator) binder = new ComponentPropertyBinder( getGrailsDomainBinder().getMetadataBuildingContext(), - namingStrategy, - jdbcEnvironment, - mappingCacheHolder, collectionHolder, enumTypeBinder, collectionBinder, - propertyFromValueCreator, - componentBinder, mockSimpleValueBinder, oneToOneBinder, manyToOneBinder, columnNameFetcher, componentUpdater ) + binder.setComponentBinder(componentBinder) } private void setupProperty(PersistentProperty prop, String name, Mapping mapping, PersistentEntity owner) { @@ -121,8 +116,6 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { setupProperty(currentGrailsProp, "street", mapping, ownerEntity) setupProperty(componentProperty, "address", mapping, ownerEntity) - propertyFromValueCreator.createProperty(_ as BasicValue, currentGrailsProp) >> hibernateProperty - when: binder.bindComponentProperty(component, componentProperty, currentGrailsProp, root, "address", table, mappings) @@ -156,8 +149,6 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { setupProperty(currentGrailsProp, "owner", mapping, ownerEntity) setupProperty(componentProperty, "address", mapping, ownerEntity) - propertyFromValueCreator.createProperty(_ as HibernateManyToOne, currentGrailsProp) >> hibernateProperty - when: binder.bindComponentProperty(component, componentProperty, currentGrailsProp, root, "address", table, mappings) @@ -195,8 +186,6 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { setupProperty(currentGrailsProp, "detail", mapping, ownerEntity) setupProperty(componentProperty, "address", mapping, ownerEntity) - propertyFromValueCreator.createProperty(_ as HibernateOneToOne, currentGrailsProp) >> hibernateProperty - when: binder.bindComponentProperty(component, componentProperty, currentGrailsProp, root, "address", table, mappings) @@ -225,10 +214,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { setupProperty(currentGrailsProp, "type", mapping, ownerEntity) setupProperty(componentProperty, "address", mapping, ownerEntity) - namingStrategy.resolveColumnName("type") >> "type_col" - namingStrategy.resolveColumnName("address") >> "address" columnNameFetcher.getColumnNameForPropertyAndPath(currentGrailsProp, "address", null) >> "address_type_col" - propertyFromValueCreator.createProperty(_ as BasicValue, currentGrailsProp) >> hibernateProperty when: binder.bindComponentProperty(component, componentProperty, currentGrailsProp, root, "address", table, mappings) @@ -260,8 +246,6 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { ownerEntity.isComponentPropertyNullable(componentProperty) >> true - propertyFromValueCreator.createProperty(_ as BasicValue, currentGrailsProp) >> hibernateProperty - when: binder.bindComponentProperty(component, componentProperty, currentGrailsProp, root, "address", table, mappings) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy index b6936d735e..1257776f72 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/CompositeIdBinderSpec.groovy @@ -13,19 +13,17 @@ import spock.lang.Subject import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentPropertyBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder -import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentUpdater import org.hibernate.mapping.Value class CompositeIdBinderSpec extends HibernateGormDatastoreSpec { def componentPropertyBinder = Mock(ComponentPropertyBinder) - def componentUpdater = Mock(ComponentUpdater) @Subject CompositeIdBinder binder def setup() { - binder = new CompositeIdBinder(getGrailsDomainBinder().getMetadataBuildingContext(), componentPropertyBinder, componentUpdater) + binder = new CompositeIdBinder(getGrailsDomainBinder().getMetadataBuildingContext(), componentPropertyBinder) } def "should bind composite id using property names from CompositeIdentity"() { @@ -99,4 +97,4 @@ class CompositeIdBinderSpec extends HibernateGormDatastoreSpec { then: thrown(org.hibernate.MappingException) } -} \ No newline at end of file +} 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 36fe049ac2..33afb724f2 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 @@ -1,16 +1,11 @@ package org.grails.orm.hibernate.cfg.domainbinding -import grails.gorm.annotation.Entity import grails.gorm.specs.HibernateGormDatastoreSpec import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity -import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty -import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover -import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher -import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder -import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher - +import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty +import org.hibernate.mapping.OneToMany import org.hibernate.mapping.RootClass -import org.hibernate.mapping.SimpleValue +import org.hibernate.mapping.Set import org.hibernate.boot.spi.MetadataBuildingContext import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment @@ -22,11 +17,6 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToMa import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder -import org.grails.orm.hibernate.cfg.GrailsDomainBinder - -import org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder -import org.grails.orm.hibernate.cfg.domainbinding.secondpass.ListSecondPassBinder - import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder @@ -40,8 +30,13 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder -import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator import org.hibernate.mapping.BasicValue +import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover +import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher +import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher +import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder +import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator +import org.grails.orm.hibernate.cfg.GrailsDomainBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -87,21 +82,18 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { ComponentUpdater componentUpdater = new ComponentUpdater(propertyFromValueCreator) ComponentPropertyBinder componentPropertyBinder = new ComponentPropertyBinder( metadataBuildingContext, - namingStrategy, - jdbcEnvironment, - binder.getMappingCacheHolder(), collectionHolder, enumTypeBinderToUse, collectionBinder, - propertyFromValueCreator, - null, simpleValueBinder, oneToOneBinder, manyToOneBinder, columnNameForPropertyAndPathFetcher, componentUpdater ) - ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder, componentUpdater) + ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder) + componentPropertyBinder.setComponentBinder(componentBinder) + GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder( metadataBuildingContext, namingStrategy, @@ -115,7 +107,7 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { manyToOneBinder, propertyFromValueCreator ) - CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, componentUpdater) + CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) @@ -157,88 +149,37 @@ class ListSecondPassBinderSpec extends HibernateGormDatastoreSpec { binders.unionSubclassBinder as UnionSubclassBinder, binders.singleTableSubclassBinder as SingleTableSubclassBinder) } + void setupSpec() { manager.addAllDomainClasses([ - ListBinderAuthor, - ListBinderBook + org.apache.grails.data.testing.tck.domains.Pet, + org.apache.grails.data.testing.tck.domains.Person, + org.apache.grails.data.testing.tck.domains.PetType ]) } - void "Test bind list second pass"() { + void "Test bind collection"() { given: - def collector = getCollector() def binder = getGrailsDomainBinder() - def binders = getBinders(binder) - def collectionBinder = binders.collectionBinder - 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 - def bookEntity = getPersistentEntity(ListBinderBook) as GrailsHibernatePersistentEntity + def collectionBinder = getBinders(binder).collectionBinder + def collector = getCollector() - // Register referenced entity in Hibernate - bindRoot(binder, bookEntity, collector, "sessionFactory") + def personEntity = getPersistentEntity(org.apache.grails.data.testing.tck.domains.Person) as GrailsHibernatePersistentEntity + def petEntity = getPersistentEntity(org.apache.grails.data.testing.tck.domains.Pet) as GrailsHibernatePersistentEntity - // Manually create RootClass for the main entity def rootClass = new RootClass(binder.getMetadataBuildingContext()) - rootClass.setEntityName(authorEntity.name) - rootClass.setJpaEntityName(authorEntity.name) - rootClass.setTable(collector.addTable(null, null, "LIST_BINDER_AUTHOR", null, false, binder.getMetadataBuildingContext())) - - // Add a primary key to avoid NPE - def pk = new org.hibernate.mapping.PrimaryKey(rootClass.table) - def idCol = new org.hibernate.mapping.Column("id") - rootClass.table.addColumn(idCol) - pk.addColumn(idCol) - rootClass.table.setPrimaryKey(pk) - collector.addEntityBinding(rootClass) - - def booksProp = authorEntity.getPropertyByName("books") as HibernateToManyProperty - def list = new org.hibernate.mapping.List(binder.getMetadataBuildingContext(), rootClass) - list.setRole(authorEntity.name + ".books") - - // Initial first pass binding needed for second pass to work - collectionBinder.bindCollection(booksProp, list, rootClass, collector, "") - - // Prepare persistentClasses map - Map persistentClasses = [ - (authorEntity.name): rootClass, - (bookEntity.name): collector.getEntityBinding(bookEntity.name) - ] + rootClass.setEntityName(personEntity.name) + rootClass.setTable(collector.addTable(null, null, "PERSON", null, false, binder.getMetadataBuildingContext())) + + def petsProp = personEntity.getPropertyByName("pets") as GrailsHibernatePersistentProperty + def collection = new Set(binder.getMetadataBuildingContext(), rootClass) when: - collectionSecondPassBinder.bindCollectionSecondPass(booksProp, collector, persistentClasses, list) - listSecondPassBinder.bindListSecondPass(booksProp, collector, persistentClasses, list) - collector.processSecondPasses(binder.getMetadataBuildingContext()) + collectionBinder.bindCollection(petsProp, collection, rootClass, collector, "") then: - list.index != null - list.index instanceof SimpleValue - ((SimpleValue)list.index).typeName == "integer" - list.element != null + collection.role == "${personEntity.name}.pets".toString() + collection.element instanceof OneToMany + (collection.element as OneToMany).referencedEntityName == petEntity.name } } - -@Entity -class ListBinderAuthor { - Long id - java.util.List<ListBinderBook> books - static hasMany = [books: ListBinderBook] -} - -@Entity -class ListBinderBook { - Long id - String title -} 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 44736dc535..951d1d31c2 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 @@ -1,16 +1,11 @@ package org.grails.orm.hibernate.cfg.domainbinding -import grails.gorm.annotation.Entity import grails.gorm.specs.HibernateGormDatastoreSpec import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity -import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty -import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover -import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher -import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder -import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher - +import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty +import org.hibernate.mapping.OneToMany import org.hibernate.mapping.RootClass -import org.hibernate.mapping.SimpleValue +import org.hibernate.mapping.Set import org.hibernate.boot.spi.MetadataBuildingContext import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment @@ -22,11 +17,6 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdentifierToMa import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher import org.grails.orm.hibernate.cfg.domainbinding.util.TableNameFetcher import org.grails.orm.hibernate.cfg.domainbinding.binder.CollectionBinder -import org.grails.orm.hibernate.cfg.GrailsDomainBinder - -import org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder -import org.grails.orm.hibernate.cfg.domainbinding.secondpass.MapSecondPassBinder - import org.grails.orm.hibernate.cfg.domainbinding.binder.OneToOneBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ComponentBinder @@ -40,8 +30,13 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.VersionBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.CompositeIdBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.SimpleIdBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.PropertyBinder -import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator import org.hibernate.mapping.BasicValue +import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover +import org.grails.orm.hibernate.cfg.domainbinding.util.DefaultColumnNameFetcher +import org.grails.orm.hibernate.cfg.domainbinding.util.ColumnNameForPropertyAndPathFetcher +import org.grails.orm.hibernate.cfg.domainbinding.collectionType.CollectionHolder +import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator +import org.grails.orm.hibernate.cfg.GrailsDomainBinder import org.grails.orm.hibernate.cfg.domainbinding.binder.ClassPropertiesBinder import org.grails.orm.hibernate.cfg.domainbinding.util.MultiTenantFilterBinder @@ -87,21 +82,18 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { ComponentUpdater componentUpdater = new ComponentUpdater(propertyFromValueCreator) ComponentPropertyBinder componentPropertyBinder = new ComponentPropertyBinder( metadataBuildingContext, - namingStrategy, - jdbcEnvironment, - binder.getMappingCacheHolder(), collectionHolder, enumTypeBinderToUse, collectionBinder, - propertyFromValueCreator, - null, simpleValueBinder, oneToOneBinder, manyToOneBinder, columnNameForPropertyAndPathFetcher, componentUpdater ) - ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder, componentUpdater) + ComponentBinder componentBinder = new ComponentBinder(metadataBuildingContext, binder.getMappingCacheHolder(), componentPropertyBinder) + componentPropertyBinder.setComponentBinder(componentBinder) + GrailsPropertyBinder propertyBinder = new GrailsPropertyBinder( metadataBuildingContext, namingStrategy, @@ -115,7 +107,7 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { manyToOneBinder, propertyFromValueCreator ) - CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder, componentUpdater) + CompositeIdBinder compositeIdBinder = new CompositeIdBinder(metadataBuildingContext, componentPropertyBinder) PropertyBinder propertyBinderHelper = new PropertyBinder() SimpleIdBinder simpleIdBinder = new SimpleIdBinder(metadataBuildingContext, namingStrategy, jdbcEnvironment, new BasicValueIdCreator(jdbcEnvironment), simpleValueBinder, propertyBinderHelper) IdentityBinder identityBinder = new IdentityBinder(simpleIdBinder, compositeIdBinder) @@ -157,88 +149,37 @@ class MapSecondPassBinderSpec extends HibernateGormDatastoreSpec { binders.unionSubclassBinder as UnionSubclassBinder, binders.singleTableSubclassBinder as SingleTableSubclassBinder) } + void setupSpec() { manager.addAllDomainClasses([ - MapAuthorBinder, - MapBookBinder + org.apache.grails.data.testing.tck.domains.Pet, + org.apache.grails.data.testing.tck.domains.Person, + org.apache.grails.data.testing.tck.domains.PetType ]) } - void "Test bind map second pass"() { + void "Test bind collection"() { given: - def collector = getCollector() def binder = getGrailsDomainBinder() - def binders = getBinders(binder) - def collectionBinder = binders.collectionBinder - 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 - def bookEntity = getPersistentEntity(MapBookBinder) as GrailsHibernatePersistentEntity + def collectionBinder = getBinders(binder).collectionBinder + def collector = getCollector() - // Register referenced entity in Hibernate - bindRoot(binder, bookEntity, collector, "sessionFactory") + def personEntity = getPersistentEntity(org.apache.grails.data.testing.tck.domains.Person) as GrailsHibernatePersistentEntity + def petEntity = getPersistentEntity(org.apache.grails.data.testing.tck.domains.Pet) as GrailsHibernatePersistentEntity - // Manually create RootClass for the main entity def rootClass = new RootClass(binder.getMetadataBuildingContext()) - rootClass.setEntityName(authorEntity.name) - rootClass.setJpaEntityName(authorEntity.name) - rootClass.setTable(collector.addTable(null, null, "MAP_AUTHOR_BINDER", null, false, binder.getMetadataBuildingContext())) - - // Add a primary key to avoid NPE - def pk = new org.hibernate.mapping.PrimaryKey(rootClass.table) - def idCol = new org.hibernate.mapping.Column("id") - rootClass.table.addColumn(idCol) - pk.addColumn(idCol) - rootClass.table.setPrimaryKey(pk) - collector.addEntityBinding(rootClass) - - def booksProp = authorEntity.getPropertyByName("books") as HibernateToManyProperty - def map = new org.hibernate.mapping.Map(binder.getMetadataBuildingContext(), rootClass) - map.setRole(authorEntity.name + ".books") - - // Initial first pass binding - collectionBinder.bindCollection(booksProp, map, rootClass, collector, "") - - // Prepare persistentClasses map - java.util.Map persistentClasses = [ - (authorEntity.name): rootClass, - (bookEntity.name): collector.getEntityBinding(bookEntity.name) - ] + rootClass.setEntityName(personEntity.name) + rootClass.setTable(collector.addTable(null, null, "PERSON", null, false, binder.getMetadataBuildingContext())) + + def petsProp = personEntity.getPropertyByName("pets") as GrailsHibernatePersistentProperty + def collection = new Set(binder.getMetadataBuildingContext(), rootClass) when: - collectionSecondPassBinder.bindCollectionSecondPass(booksProp, collector, persistentClasses, map) - mapSecondPassBinder.bindMapSecondPass(booksProp, collector, persistentClasses, map) - collector.processSecondPasses(binder.getMetadataBuildingContext()) + collectionBinder.bindCollection(petsProp, collection, rootClass, collector, "") then: - map.index != null - map.index instanceof SimpleValue - ((SimpleValue)map.index).typeName == "string" - map.element != null + collection.role == "${personEntity.name}.pets".toString() + collection.element instanceof OneToMany + (collection.element as OneToMany).referencedEntityName == petEntity.name } } - -@Entity -class MapAuthorBinder { - Long id - java.util.Map<String, MapBookBinder> books - static hasMany = [books: MapBookBinder] -} - -@Entity -class MapBookBinder { - Long id - String title -}
