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 15f67da50024529b54b808a0ffeef817d015e9e3 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Thu Feb 12 21:35:16 2026 -0600 Simplify GORM Hibernate 7 binder code by using specific persistent types. - Replace PersistentEntity/PersistentProperty with GrailsHibernatePersistentEntity/GrailsHibernatePersistentProperty in binder signatures. - Reduce explicit casting in binding logic. - Standardize on getPersistentPropertiesToBind() where appropriate. - Fix compilation issues in ClassBinder, ComponentBinder and CollectionSecondPassBinder. - Maintain compatibility with existing unit test mocks by reverting some parameters to base types where necessary. --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 3 +- .../cfg/domainbinding/binder/ClassBinder.java | 7 +-- .../cfg/domainbinding/binder/CollectionBinder.java | 21 ++------- .../cfg/domainbinding/binder/ComponentBinder.java | 7 +-- .../binder/ComponentPropertyBinder.java | 18 ++++---- .../domainbinding/binder/CompositeIdBinder.java | 23 ++++------ .../CompositeIdentifierToManyToOneBinder.java | 4 +- .../domainbinding/binder/GrailsPropertyBinder.java | 12 ++--- .../cfg/domainbinding/binder/ManyToOneBinder.java | 19 ++++---- .../cfg/domainbinding/binder/VersionBinder.java | 9 ++-- .../secondpass/CollectionSecondPassBinder.java | 53 ++++++++++------------ .../domainbinding/GrailsPropertyBinderSpec.groovy | 3 +- 12 files changed, 74 insertions(+), 105 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 9785aba27e..af6e9ca522 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 @@ -578,7 +578,8 @@ public class GrailsDomainBinder for (GrailsHibernatePersistentProperty currentGrailsProp : domainClass.getPersistentPropertiesToBind()) { - grailsPropertyBinder.bindProperty(persistentClass, currentGrailsProp, mappings, sessionFactoryBeanName); + var value = grailsPropertyBinder.bindProperty(persistentClass, currentGrailsProp, mappings, sessionFactoryBeanName); + persistentClass.addProperty(propertyFromValueCreator.createProperty(value, currentGrailsProp)); } new NaturalIdentifierBinder().bindNaturalIdentifier(domainClass.getMappedForm(), persistentClass); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java index 87c034ab80..0a36736c05 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java @@ -1,6 +1,6 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; -import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.Mapping; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.mapping.PersistentClass; @@ -19,7 +19,7 @@ public class ClassBinder { * @param persistentClass The persistant class * @param collector Existing collector */ - public void bindClass(@Nonnull PersistentEntity persistentEntity, PersistentClass persistentClass, @Nonnull InFlightMetadataCollector collector) { + public void bindClass(@Nonnull GrailsHibernatePersistentEntity persistentEntity, PersistentClass persistentClass, @Nonnull InFlightMetadataCollector collector) { persistentClass.setLazy(true); var entityName = persistentEntity.getName(); persistentClass.setEntityName(entityName); @@ -31,7 +31,8 @@ public class ClassBinder { persistentClass.setSelectBeforeUpdate(false); boolean autoImport; - if (persistentEntity.getMapping().getMappedForm() instanceof Mapping mappedForm) { + Mapping mappedForm = persistentEntity.getMappedForm(); + if (mappedForm != null) { autoImport = mappedForm.isAutoImport(); } else { autoImport = collector.getMetadataBuildingOptions().getMappingDefaults().isAutoImportEnabled(); 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 33ca3896af..28ef711d04 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 @@ -2,15 +2,14 @@ package org.grails.orm.hibernate.cfg.domainbinding.binder; import jakarta.annotation.Nonnull; -import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.orm.hibernate.cfg.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.GrailsHibernateUtil; +import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; 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.DefaultColumnNameFetcher; import org.grails.orm.hibernate.cfg.domainbinding.util.NamespaceNameExtractor; import org.grails.orm.hibernate.cfg.domainbinding.util.TableForManyCalculator; import org.grails.orm.hibernate.cfg.domainbinding.secondpass.CollectionSecondPassBinder; @@ -43,7 +42,6 @@ public class CollectionBinder { private final ListSecondPassBinder listSecondPassBinder; private final CollectionSecondPassBinder collectionSecondPassBinder; private final MapSecondPassBinder mapSecondPassBinder; - private final DefaultColumnNameFetcher defaultColumnNameFetcher; public CollectionBinder(MetadataBuildingContext metadataBuildingContext, GrailsDomainBinder grailsDomainBinder, PersistentEntityNamingStrategy namingStrategy) { this.metadataBuildingContext = metadataBuildingContext; @@ -52,7 +50,6 @@ public class CollectionBinder { this.collectionSecondPassBinder = new CollectionSecondPassBinder(metadataBuildingContext, namingStrategy); this.listSecondPassBinder = new ListSecondPassBinder(metadataBuildingContext, namingStrategy,collectionSecondPassBinder); this.mapSecondPassBinder = new MapSecondPassBinder(metadataBuildingContext, namingStrategy, collectionSecondPassBinder); - this.defaultColumnNameFetcher = new DefaultColumnNameFetcher(namingStrategy); } @@ -92,7 +89,7 @@ public class CollectionBinder { if (property.shouldBindWithForeignKey()) { OneToMany oneToMany = new OneToMany(metadataBuildingContext, collection.getOwner()); collection.setElement(oneToMany); - bindOneToMany((org.grails.datastore.mapping.model.types.OneToMany) property, oneToMany, mappings); + bindOneToMany((org.grails.datastore.mapping.model.types.OneToMany) property, oneToMany); } else { bindCollectionTable(property, mappings, collection, owner.getTable()); @@ -122,14 +119,14 @@ public class CollectionBinder { } - private String getNameForPropertyAndPath(PersistentProperty property, String path) { + private String getNameForPropertyAndPath(GrailsHibernatePersistentProperty property, String path) { if (GrailsHibernateUtil.isNotEmpty(path)) { return GrailsHibernateUtil.qualify(path, property.getName()); } return property.getName(); } - private void bindOneToMany(org.grails.datastore.mapping.model.types.OneToMany currentGrailsProp, OneToMany one, @Nonnull InFlightMetadataCollector mappings) { + private void bindOneToMany(org.grails.datastore.mapping.model.types.OneToMany currentGrailsProp, OneToMany one) { one.setReferencedEntityName(currentGrailsProp.getAssociatedEntity().getName()); one.setIgnoreNotFound(true); } @@ -163,12 +160,4 @@ public class CollectionBinder { schemaName, catalogName, tableName, null, false, metadataBuildingContext)); } - - - - - - - - -} \ No newline at end of file +} 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 2847160eba..30eea090bf 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 @@ -56,12 +56,9 @@ public class ComponentBinder { continue; } - if (currentGrailsProp instanceof GrailsHibernatePersistentProperty) { - componentPropertyBinder.bindComponentProperty(component, property, (GrailsHibernatePersistentProperty) currentGrailsProp, persistentClass, path, + if (currentGrailsProp instanceof GrailsHibernatePersistentProperty hibernateProp) { + componentPropertyBinder.bindComponentProperty(component, property, hibernateProp, persistentClass, path, table, mappings, sessionFactoryBeanName); - } else { - // Handle cases where currentGrailsProp is not a GrailsHibernatePersistentProperty - // For now, we'll just skip binding for such properties in this test context } } } 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 6a7f3214ed..54d15ac0a4 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 @@ -115,11 +115,11 @@ public class ComponentPropertyBinder { value = new ManyToOne(metadataBuildingContext, table); new ManyToOneBinder(namingStrategy).bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path); - } else if (currentGrailsProp instanceof org.grails.datastore.mapping.model.types.OneToOne) { + } 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) currentGrailsProp).canBindOneToOneWithSingleColumnAndForeignKey()) { + if (association.canBindOneToOneWithSingleColumnAndForeignKey()) { value = new OneToOne(metadataBuildingContext, table, persistentClass); new OneToOneBinder(namingStrategy).bindOneToOne((org.grails.datastore.mapping.model.types.OneToOne) currentGrailsProp, (OneToOne) value, path); } @@ -128,9 +128,9 @@ public class ComponentPropertyBinder { new ManyToOneBinder(namingStrategy).bindManyToOne((Association) currentGrailsProp, (ManyToOne) value, path); } } - else if (currentGrailsProp instanceof Embedded) { + else if (currentGrailsProp instanceof Embedded embedded) { value = new Component(metadataBuildingContext, persistentClass); - componentBinder.bindComponent((Component) value, (Embedded) currentGrailsProp, true, mappings, sessionFactoryBeanName); + componentBinder.bindComponent((Component) value, embedded, true, mappings, sessionFactoryBeanName); } else { if (LOG.isDebugEnabled()) @@ -138,16 +138,16 @@ public class ComponentPropertyBinder { value = new BasicValue(metadataBuildingContext, table); if (currentGrailsProp.getType().isEnum()) { - String columnName = new ColumnNameForPropertyAndPathFetcher(namingStrategy).getColumnNameForPropertyAndPath((GrailsHibernatePersistentProperty) currentGrailsProp, path, null); - enumTypeBinder.bindEnumType((GrailsHibernatePersistentProperty) currentGrailsProp, currentGrailsProp.getType(), (SimpleValue) value, columnName); + String columnName = new ColumnNameForPropertyAndPathFetcher(namingStrategy).getColumnNameForPropertyAndPath(currentGrailsProp, path, null); + enumTypeBinder.bindEnumType(currentGrailsProp, currentGrailsProp.getType(), (SimpleValue) value, columnName); } else { // set type - this.simpleValueBinder.bindSimpleValue((GrailsHibernatePersistentProperty) currentGrailsProp, (GrailsHibernatePersistentProperty) componentProperty, (SimpleValue) value, path); + this.simpleValueBinder.bindSimpleValue(currentGrailsProp, (GrailsHibernatePersistentProperty) componentProperty, (SimpleValue) value, path); } } - Property persistentProperty = propertyFromValueCreator.createProperty(value, (GrailsHibernatePersistentProperty) currentGrailsProp); + Property persistentProperty = propertyFromValueCreator.createProperty(value, currentGrailsProp); component.addProperty(persistentProperty); if (componentProperty != null && componentProperty.getOwner() instanceof GrailsHibernatePersistentEntity ghpe && ghpe.isComponentPropertyNullable(componentProperty)) { final Iterator<?> columnIterator = value.getColumns().iterator(); @@ -162,4 +162,4 @@ public class ComponentPropertyBinder { boolean isNullable, @Nonnull InFlightMetadataCollector mappings, String sessionFactoryBeanName) { componentBinder.bindComponent(component, property, isNullable, mappings, sessionFactoryBeanName); } -} \ No newline at end of file +} 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 d5d5cb5ba4..f030bf0847 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 @@ -6,8 +6,6 @@ import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.mapping.Component; import org.hibernate.mapping.RootClass; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.orm.hibernate.cfg.CompositeIdentity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; @@ -26,12 +24,7 @@ public class CompositeIdBinder { } - public void bindCompositeId(@Nonnull PersistentEntity domainClass, RootClass root, - CompositeIdentity compositeIdentity, @Nonnull InFlightMetadataCollector mappings, String sessionFactoryBeanName) { - bindCompositeId(domainClass, (GrailsHibernatePersistentEntity) domainClass, root, compositeIdentity, mappings, sessionFactoryBeanName); - } - - public void bindCompositeId(@Nonnull PersistentEntity domainClass, @Nonnull GrailsHibernatePersistentEntity hibernatePersistentEntity, RootClass root, + public void bindCompositeId(@Nonnull GrailsHibernatePersistentEntity domainClass, RootClass root, CompositeIdentity compositeIdentity, @Nonnull InFlightMetadataCollector mappings, String sessionFactoryBeanName) { Component id = new Component(metadataBuildingContext, root); id.setNullValue("undefined"); @@ -46,29 +39,29 @@ public class CompositeIdBinder { id.setRoleName(path); - PersistentProperty[] composite; + GrailsHibernatePersistentProperty[] composite; if (compositeIdentity != null && compositeIdentity.getPropertyNames() != null) { String[] propertyNames = compositeIdentity.getPropertyNames(); - composite = new PersistentProperty[propertyNames.length]; + composite = new GrailsHibernatePersistentProperty[propertyNames.length]; for (int i = 0; i < propertyNames.length; i++) { - composite[i] = domainClass.getPropertyByName(propertyNames[i]); + composite[i] = (GrailsHibernatePersistentProperty) domainClass.getPropertyByName(propertyNames[i]); } } else { - composite = hibernatePersistentEntity.getCompositeIdentity(); + composite = domainClass.getCompositeIdentity(); } if (composite == null) { throw new MappingException("No composite identifier properties found for class [" + domainClass.getName() + "]"); } - PersistentProperty identifierProp = hibernatePersistentEntity.getIdentity(); - for (PersistentProperty property : composite) { + GrailsHibernatePersistentProperty identifierProp = domainClass.getIdentity(); + for (GrailsHibernatePersistentProperty property : composite) { if (property == null) { throw new MappingException("Property referenced in composite-id mapping of class [" + domainClass.getName() + "] is not a valid property!"); } - componentPropertyBinder.bindComponentProperty(id, identifierProp, (GrailsHibernatePersistentProperty) property, root, "", root.getTable(), mappings, sessionFactoryBeanName); + componentPropertyBinder.bindComponentProperty(id, identifierProp, property, root, "", root.getTable(), mappings, sessionFactoryBeanName); } } } 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 f29e27d8b7..0d6674579a 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 @@ -75,7 +75,7 @@ public class CompositeIdentifierToManyToOneBinder { // if the name is null then configure the name by convention if (cc.getName() == null) { // use the referenced table name as a prefix - String prefix = tableNameFetcher.getTableName((GrailsHibernatePersistentEntity) refDomainClass); + String prefix = refDomainClass instanceof GrailsHibernatePersistentEntity ghpe ? tableNameFetcher.getTableName(ghpe) : refDomainClass.getName(); PersistentProperty referencedProperty = refDomainClass.getPropertyByName(propertyName); // if the referenced property is a ToOne and it has a composite id @@ -108,4 +108,4 @@ public class CompositeIdentifierToManyToOneBinder { // set type simpleValueBinder.bindSimpleValue(property, null, value, path); } -} \ No newline at end of file +} 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 e99c64bbdf..e85fb8e881 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 @@ -20,7 +20,6 @@ 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; @@ -89,7 +88,7 @@ public class GrailsPropertyBinder { this.propertyFromValueCreator = propertyFromValueCreator; } - public void bindProperty(PersistentClass persistentClass + public Value bindProperty(PersistentClass persistentClass , @Nonnull GrailsHibernatePersistentProperty currentGrailsProp , @Nonnull InFlightMetadataCollector mappings , String sessionFactoryBeanName) { @@ -136,9 +135,9 @@ public class GrailsPropertyBinder { value = new ManyToOne(metadataBuildingContext, table); manyToOneBinder.bindManyToOne((Association)currentGrailsProp, (ManyToOne)value, EMPTY_PATH); } - else if (currentGrailsProp instanceof Embedded) { + else if (currentGrailsProp instanceof Embedded embedded) { value = new Component(metadataBuildingContext, persistentClass); - componentPropertyBinder.bindComponent((Component)value, (Embedded)currentGrailsProp, true, mappings, sessionFactoryBeanName); + componentPropertyBinder.bindComponent((Component)value, embedded, true, mappings, sessionFactoryBeanName); } // work out what type of relationship it is and bind value else { // Default BasicValue @@ -146,9 +145,6 @@ public class GrailsPropertyBinder { simpleValueBinder.bindSimpleValue(currentGrailsProp, null,(SimpleValue) value, EMPTY_PATH); } - if (value != null) { - Property property = propertyFromValueCreator.createProperty(value, currentGrailsProp); - persistentClass.addProperty(property); - } + return value; } } 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 c3c0dee0d5..40c754aaa8 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 @@ -4,7 +4,6 @@ import org.hibernate.MappingException; import org.hibernate.mapping.Column; import org.hibernate.mapping.ManyToOne; -import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.ManyToMany; import org.grails.datastore.mapping.model.types.OneToOne; @@ -57,21 +56,19 @@ public class ManyToOneBinder { public void bindManyToOne(Association property , ManyToOne manyToOne ,String path) { + GrailsHibernatePersistentProperty hibernateProperty = (GrailsHibernatePersistentProperty) property; manyToOneValuesBinder.bindManyToOneValues(property, manyToOne); - PersistentEntity refDomainClass = property instanceof ManyToMany ? property.getOwner() : property.getAssociatedEntity(); - Mapping mapping = null; - if (refDomainClass instanceof GrailsHibernatePersistentEntity) { - mapping = ((GrailsHibernatePersistentEntity) refDomainClass).getMappedForm(); - } + GrailsHibernatePersistentEntity refDomainClass = (GrailsHibernatePersistentEntity) (property instanceof ManyToMany ? property.getOwner() : property.getAssociatedEntity()); + Mapping mapping = refDomainClass.getMappedForm(); boolean isComposite = mapping != null && mapping.hasCompositeIdentifier(); if (isComposite) { CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity(); - compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne((GrailsHibernatePersistentProperty) property, manyToOne, ci, refDomainClass, path); + compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne(hibernateProperty, manyToOne, ci, refDomainClass, path); } else { if (property.isCircular() && (property instanceof ManyToMany)) { - PropertyConfig pc = ((GrailsHibernatePersistentProperty) property).getMappedForm(); + PropertyConfig pc = hibernateProperty.getMappedForm(); if (mapping != null && pc.getColumns().isEmpty()) { mapping.getColumns().put(property.getName(), pc); @@ -84,16 +81,16 @@ public class ManyToOneBinder { pc.setJoinTable(jt); } // set type - simpleValueBinder.bindSimpleValue((GrailsHibernatePersistentProperty) property, null, manyToOne, path); + simpleValueBinder.bindSimpleValue(hibernateProperty, null, manyToOne, path); } else { // bind column // set type - simpleValueBinder.bindSimpleValue((GrailsHibernatePersistentProperty) property, null, manyToOne, path); + simpleValueBinder.bindSimpleValue(hibernateProperty, null, manyToOne, path); } } - PropertyConfig config = ((GrailsHibernatePersistentProperty) property).getMappedForm(); + PropertyConfig config = hibernateProperty.getMappedForm(); boolean isOneToOne = property instanceof OneToOne; boolean notComposite = !isComposite; if (isOneToOne && notComposite) { 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 ac07455fb5..e3fcb4c4d4 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 @@ -7,7 +7,6 @@ import org.hibernate.mapping.Property; import org.hibernate.mapping.RootClass; import org.hibernate.mapping.Table; -import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; @@ -39,21 +38,21 @@ public class VersionBinder { this.basicValueFactory = basicValueFactory; } - public void bindVersion(PersistentProperty version, RootClass entity) { + public void bindVersion(GrailsHibernatePersistentProperty version, RootClass entity) { if (version != null) { BasicValue val = basicValueFactory.apply(metadataBuildingContext, entity.getTable()); // set type - simpleValueBinder.bindSimpleValue((GrailsHibernatePersistentProperty) version, null, val, EMPTY_PATH); + simpleValueBinder.bindSimpleValue(version, null, val, EMPTY_PATH); if (!val.isTypeSpecified()) { val.setTypeName("version".equals(version.getName()) ? "integer" : "timestamp"); } Property prop = new Property(); prop.setValue(val); - propertyBinder.bindProperty((GrailsHibernatePersistentProperty) version, prop); + propertyBinder.bindProperty(version, prop); prop.setLazy(false); val.setNullValue("undefined"); entity.setVersion(prop); @@ -65,4 +64,4 @@ public class VersionBinder { entity.setOptimisticLockStyle(OptimisticLockStyle.NONE); } } -} \ No newline at end of file +} 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 8714839bba..3c180cf98d 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 @@ -2,7 +2,6 @@ package org.grails.orm.hibernate.cfg.domainbinding.secondpass; import jakarta.annotation.Nonnull; import org.grails.datastore.mapping.model.DatastoreConfigurationException; -import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.model.types.Association; @@ -77,7 +76,7 @@ public class CollectionSecondPassBinder { "] are not supported with unidirectional one to many relationships."); } if (referenced != null) { - PersistentProperty propertyToSortBy = referenced.getPropertyByName(propConfig.getSort()); + GrailsHibernatePersistentProperty propertyToSortBy = (GrailsHibernatePersistentProperty) referenced.getPropertyByName(propConfig.getSort()); String associatedClassName = referenced.getName(); @@ -136,7 +135,7 @@ public class CollectionSecondPassBinder { } // setup the primary key references - DependantValue key = createPrimaryKeyValue(mappings, property, collection, persistentClasses); + DependantValue key = createPrimaryKeyValue(mappings, property, collection); // link a bidirectional relationship if (property.isBidirectional()) { @@ -184,7 +183,7 @@ public class CollectionSecondPassBinder { if (LOG.isDebugEnabled()) LOG.debug("[CollectionSecondPassBinder] Mapping other side " + otherSide.getOwner().getName() + "." + otherSide.getName() + " -> " + collection.getCollectionTable().getName() + " as ManyToOne"); ManyToOne element = new ManyToOne(metadataBuildingContext, collection.getCollectionTable()); - bindManyToMany((Association)otherSide, element, mappings, sessionFactoryBeanName); + bindManyToMany((Association)otherSide, element); collection.setElement(element); new CollectionForPropertyConfigBinder().bindCollectionForPropertyConfig(collection, propConfig); if (property.isCircular()) { @@ -198,14 +197,14 @@ public class CollectionSecondPassBinder { // there are problems with list and map mappings and join columns relating to duplicate key constraints // TODO change this when HHH-1268 is resolved if (!property.shouldBindWithForeignKey()) { - bindCollectionWithJoinTable(property, mappings, collection, propConfig, sessionFactoryBeanName); + bindCollectionWithJoinTable(property, mappings, collection, propConfig); } else { bindUnidirectionalOneToMany((org.grails.datastore.mapping.model.types.OneToMany) property, mappings, collection); } } else if (property.supportsJoinColumnMapping()) { - bindCollectionWithJoinTable(property, mappings, collection, propConfig, sessionFactoryBeanName); + bindCollectionWithJoinTable(property, mappings, collection, propConfig); } - forceNullableAndCheckUpdateable(key, property, mappings); + forceNullableAndCheckUpdateable(key, property); } private void bindUnidirectionalOneToMany(org.grails.datastore.mapping.model.types.OneToMany property, @Nonnull InFlightMetadataCollector mappings, Collection collection) { @@ -222,7 +221,7 @@ public class CollectionSecondPassBinder { collection.setInverse(false); PersistentClass referenced = mappings.getEntityBinding(entityName); Backref prop = new Backref(); - PersistentEntity owner = property.getOwner(); + GrailsHibernatePersistentEntity owner = (GrailsHibernatePersistentEntity) property.getOwner(); prop.setEntityName(owner.getName()); String s2 = property.getName(); prop.setName(UNDERSCORE + new BackticksRemover().apply(owner.getJavaClass().getSimpleName()) + UNDERSCORE + new BackticksRemover().apply(s2) + "Backref"); @@ -236,7 +235,7 @@ public class CollectionSecondPassBinder { } private void bindCollectionWithJoinTable(HibernateToManyProperty property, - @Nonnull InFlightMetadataCollector mappings, Collection collection, PropertyConfig config, String sessionFactoryBeanName) { + @Nonnull InFlightMetadataCollector mappings, Collection collection, PropertyConfig config) { collection.setInverse(false); SimpleValue element; @@ -305,14 +304,14 @@ public class CollectionSecondPassBinder { } if (m != null && m.hasCompositeIdentifier()) { CompositeIdentity ci = (CompositeIdentity) m.getIdentity(); - new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne((GrailsHibernatePersistentProperty) property, element, ci, domainClass, EMPTY_PATH); + new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne(property, element, ci, domainClass, EMPTY_PATH); } else { if (joinColumnMappingOptional.isPresent()) { columnName = joinColumnMappingOptional.get().getName(); } else { - var decapitalize = domainClass.getRootEntity().getJavaClass().getSimpleName(); + var decapitalize = domainClass.getHibernateRootEntity().getJavaClass().getSimpleName(); columnName = namingStrategy.resolveColumnName(decapitalize) + FOREIGN_KEY_SUFFIX; } @@ -342,8 +341,7 @@ public class CollectionSecondPassBinder { manyToOne.setReferencedEntityName(property.getHibernateAssociatedEntity().getName()); } - private void bindManyToMany(Association property, ManyToOne element, - @Nonnull InFlightMetadataCollector mappings, String sessionFactoryBeanName) { + private void bindManyToMany(Association property, ManyToOne element) { new ManyToOneBinder(namingStrategy).bindManyToOne(property, element, EMPTY_PATH); element.setReferencedEntityName(property.getOwner().getName()); } @@ -355,28 +353,25 @@ public class CollectionSecondPassBinder { LOG.debug("[CollectionSecondPassBinder] binding [" + property.getName() + "] with dependant key"); } - PersistentEntity refDomainClass = property.getOwner(); - Mapping mapping = null; - if (refDomainClass instanceof GrailsHibernatePersistentEntity persistentEntity) { - mapping = persistentEntity.getMappedForm(); - } + GrailsHibernatePersistentEntity refDomainClass = property.getHibernateOwner(); + Mapping mapping = refDomainClass.getMappedForm(); boolean hasCompositeIdentifier = mapping != null && mapping.hasCompositeIdentifier(); if (hasCompositeIdentifier && property.supportsJoinColumnMapping()) { CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity(); - new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne((GrailsHibernatePersistentProperty) property, key, ci, refDomainClass, EMPTY_PATH); + new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne(property, key, ci, refDomainClass, EMPTY_PATH); } else { // set type - GrailsHibernatePersistentProperty identity = (GrailsHibernatePersistentProperty) refDomainClass.getIdentity(); + GrailsHibernatePersistentProperty identity = refDomainClass.getIdentity(); if (identity != null) { - new SimpleValueBinder(namingStrategy).bindSimpleValue((GrailsHibernatePersistentProperty) property, null, key, EMPTY_PATH, identity); + new SimpleValueBinder(namingStrategy).bindSimpleValue(property, null, key, EMPTY_PATH, identity); } else { - new SimpleValueBinder(namingStrategy).bindSimpleValue((GrailsHibernatePersistentProperty) property, null, key, EMPTY_PATH); + new SimpleValueBinder(namingStrategy).bindSimpleValue(property, null, key, EMPTY_PATH); } } } - private void linkBidirectionalOneToMany(Collection collection, PersistentClass associatedClass, DependantValue key, PersistentProperty otherSide) { + private void linkBidirectionalOneToMany(Collection collection, PersistentClass associatedClass, DependantValue key, GrailsHibernatePersistentProperty otherSide) { collection.setInverse(true); // Iterator mappedByColumns = associatedClass.getProperty(otherSide.getName()).getValue().getColumnIterator(); @@ -387,7 +382,7 @@ public class CollectionSecondPassBinder { } } - private void linkValueUsingAColumnCopy(PersistentProperty prop, Column column, DependantValue key) { + private void linkValueUsingAColumnCopy(GrailsHibernatePersistentProperty prop, Column column, DependantValue key) { Column mappingColumn = new Column(); mappingColumn.setName(column.getName()); mappingColumn.setLength(column.getLength()); @@ -412,7 +407,7 @@ public class CollectionSecondPassBinder { } } - private void forceNullableAndCheckUpdateable(DependantValue key, PersistentProperty property, InFlightMetadataCollector mappings) { + private void forceNullableAndCheckUpdateable(DependantValue key, GrailsHibernatePersistentProperty property) { Iterator<?> it = key.getColumns().iterator(); while (it.hasNext()) { Object next = it.next(); @@ -422,8 +417,8 @@ public class CollectionSecondPassBinder { } int unidirectionalCount = 0; - PersistentEntity owner = property.getOwner(); - for (PersistentProperty p : owner.getPersistentProperties()) { + GrailsHibernatePersistentEntity owner = property.getHibernateOwner(); + for (GrailsHibernatePersistentProperty p : owner.getPersistentPropertiesToBind()) { if (p instanceof Association association && !association.isBidirectional()) { unidirectionalCount++; } @@ -436,8 +431,8 @@ public class CollectionSecondPassBinder { } } - private DependantValue createPrimaryKeyValue(@Nonnull InFlightMetadataCollector mappings, PersistentProperty property, - Collection collection, java.util.Map<?, ?> persistentClasses) { + private DependantValue createPrimaryKeyValue(@Nonnull InFlightMetadataCollector mappings, GrailsHibernatePersistentProperty property, + Collection collection) { KeyValue keyValue; DependantValue key; String propertyRef = collection.getReferencedPropertyName(); diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy index 9c726bdbb5..18357514fd 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/GrailsPropertyBinderSpec.groovy @@ -322,7 +322,8 @@ class GrailsPropertyBinderSpec extends HibernateGormDatastoreSpec { simpleValueBinder, columnNameForPropertyAndPathFetcher, oneToOneBinder, - manyToOneBinder + manyToOneBinder, + propertyFromValueCreator ) def mappings = Mock(org.hibernate.boot.spi.InFlightMetadataCollector)
