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 9e3e2062f50016d854836358761ad7cc2587d994 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Fri Feb 13 08:44:25 2026 -0600 systematically refactored the domainbinding package to use Hibernate-specific property types (HibernateManyToManyProperty, HibernateOneToManyProperty, etc.) for internal logic and instanceof checks, which improves clarity and type safety while maintaining GORM's core abstractions --- .gitignore | 1 + .../orm/hibernate/cfg/GrailsDomainBinder.java | 4 +++ .../cfg/domainbinding/binder/CollectionBinder.java | 7 ++-- .../cfg/domainbinding/binder/ColumnBinder.java | 8 ++--- .../cfg/domainbinding/binder/ManyToOneBinder.java | 11 ++++--- .../hibernate/HibernateToManyProperty.java | 6 ++-- .../secondpass/CollectionSecondPassBinder.java | 13 ++++---- .../secondpass/ListSecondPassBinder.java | 4 +-- .../secondpass/MapSecondPassBinder.java | 4 ++- .../domainbinding/util/CascadeBehaviorFetcher.java | 12 ++++--- .../util/DefaultColumnNameFetcher.java | 7 ++-- .../cfg/domainbinding/util/LogCascadeMapping.java | 16 ++++----- .../domainbinding/util/TableForManyCalculator.java | 4 +-- .../ComponentPropertyBinderSpec.groovy | 38 ++++++++++------------ .../cfg/domainbinding/LogCascadeMappingSpec.groovy | 14 +++++--- .../cfg/domainbinding/ManyToOneBinderSpec.groovy | 24 +++++++------- 16 files changed, 94 insertions(+), 79 deletions(-) diff --git a/.gitignore b/.gitignore index d9ccaf508a..e66c1dbce7 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ report01.txt report02.txt settings5.gradle settings6.gradle +STATE_SNAPSHOT.xml 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 af6e9ca522..b7b33c78d7 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 @@ -23,6 +23,10 @@ import org.grails.orm.hibernate.cfg.domainbinding.binder.ColumnConfigToColumnBin 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.EnumTypeBinder; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty; import org.grails.orm.hibernate.cfg.domainbinding.util.NamingStrategyProvider; import org.grails.orm.hibernate.cfg.domainbinding.binder.GrailsPropertyBinder; import org.grails.orm.hibernate.cfg.domainbinding.binder.IdentityBinder; 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 28ef711d04..bc10354bb4 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 @@ -5,6 +5,7 @@ import jakarta.annotation.Nonnull; 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.HibernateOneToManyProperty; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.PropertyConfig; @@ -89,7 +90,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); + bindOneToMany((HibernateOneToManyProperty) property, oneToMany); } else { bindCollectionTable(property, mappings, collection, owner.getTable()); @@ -126,8 +127,8 @@ public class CollectionBinder { return property.getName(); } - private void bindOneToMany(org.grails.datastore.mapping.model.types.OneToMany currentGrailsProp, OneToMany one) { - one.setReferencedEntityName(currentGrailsProp.getAssociatedEntity().getName()); + private void bindOneToMany(HibernateOneToManyProperty currentGrailsProp, OneToMany one) { + one.setReferencedEntityName(currentGrailsProp.getHibernateAssociatedEntity().getName()); one.setIgnoreNotFound(true); } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ColumnBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ColumnBinder.java index fe698bb34f..c40c0c1344 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ColumnBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ColumnBinder.java @@ -6,11 +6,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.grails.datastore.mapping.model.types.Association; -import org.grails.datastore.mapping.model.types.ManyToMany; -import org.grails.datastore.mapping.model.types.OneToOne; import org.grails.datastore.mapping.model.types.ToOne; import org.grails.orm.hibernate.cfg.ColumnConfig; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.PropertyConfig; @@ -93,9 +93,9 @@ public class ColumnBinder { if (column.getName() == null) { column.setName(columnName); } - if (property instanceof ManyToMany) { + if (property instanceof HibernateManyToManyProperty) { column.setNullable(false); - } else if (property instanceof OneToOne && association.isBidirectional() && !association.isOwningSide()) { + } else if (property instanceof HibernateOneToOneProperty && association.isBidirectional() && !association.isOwningSide()) { if (association.getInverseSide().isHasOne()) { column.setNullable(false); } else { 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 40c754aaa8..48f654ec6c 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 @@ -5,8 +5,6 @@ import org.hibernate.mapping.Column; import org.hibernate.mapping.ManyToOne; import org.grails.datastore.mapping.model.types.Association; -import org.grails.datastore.mapping.model.types.ManyToMany; -import org.grails.datastore.mapping.model.types.OneToOne; import org.grails.orm.hibernate.cfg.ColumnConfig; import org.grails.orm.hibernate.cfg.CompositeIdentity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; @@ -15,6 +13,9 @@ import org.grails.orm.hibernate.cfg.JoinTable; 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.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty; import org.grails.orm.hibernate.cfg.domainbinding.util.SimpleValueColumnFetcher; import static org.grails.orm.hibernate.cfg.GrailsDomainBinder.FOREIGN_KEY_SUFFIX; @@ -58,7 +59,7 @@ public class ManyToOneBinder { ,String path) { GrailsHibernatePersistentProperty hibernateProperty = (GrailsHibernatePersistentProperty) property; manyToOneValuesBinder.bindManyToOneValues(property, manyToOne); - GrailsHibernatePersistentEntity refDomainClass = (GrailsHibernatePersistentEntity) (property instanceof ManyToMany ? property.getOwner() : property.getAssociatedEntity()); + GrailsHibernatePersistentEntity refDomainClass = (GrailsHibernatePersistentEntity) (property instanceof HibernateManyToManyProperty ? property.getOwner() : property.getAssociatedEntity()); Mapping mapping = refDomainClass.getMappedForm(); boolean isComposite = mapping != null && mapping.hasCompositeIdentifier(); @@ -67,7 +68,7 @@ public class ManyToOneBinder { compositeIdentifierToManyToOneBinder.bindCompositeIdentifierToManyToOne(hibernateProperty, manyToOne, ci, refDomainClass, path); } else { - if (property.isCircular() && (property instanceof ManyToMany)) { + if (property.isCircular() && (property instanceof HibernateManyToManyProperty)) { PropertyConfig pc = hibernateProperty.getMappedForm(); if (mapping != null && pc.getColumns().isEmpty()) { @@ -91,7 +92,7 @@ public class ManyToOneBinder { } PropertyConfig config = hibernateProperty.getMappedForm(); - boolean isOneToOne = property instanceof OneToOne; + boolean isOneToOne = property instanceof HibernateOneToOneProperty; boolean notComposite = !isComposite; if (isOneToOne && notComposite) { manyToOne.setAlternateUniqueKey(true); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java index 858b074a8b..0b4f096665 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.java @@ -2,8 +2,6 @@ package org.grails.orm.hibernate.cfg.domainbinding.hibernate; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.Basic; -import org.grails.datastore.mapping.model.types.ManyToMany; -import org.grails.datastore.mapping.model.types.OneToMany; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; @@ -42,10 +40,10 @@ public interface HibernateToManyProperty extends GrailsHibernatePersistentProper * @return Whether the collection should be bound with a foreign key */ default boolean shouldBindWithForeignKey() { - return ((this instanceof OneToMany) && isBidirectional() || + return ((this instanceof HibernateOneToManyProperty) && isBidirectional() || !isUnidirectionalOneToMany()) && !Map.class.isAssignableFrom(getType()) && - !(this instanceof ManyToMany) && + !(this instanceof HibernateManyToManyProperty) && !(this instanceof Basic); } } 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 9c8e61763e..c53b7698b8 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 @@ -6,8 +6,9 @@ import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.Basic; -import org.grails.datastore.mapping.model.types.ManyToMany; import org.grails.orm.hibernate.cfg.*; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; 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.binder.CollectionForPropertyConfigBinder; @@ -71,7 +72,7 @@ public class CollectionSecondPassBinder { GrailsHibernatePersistentEntity referenced = property.getHibernateAssociatedEntity(); if (StringUtils.hasText(propConfig.getSort())) { - if (!property.isBidirectional() && (property instanceof org.grails.datastore.mapping.model.types.OneToMany)) { + if (!property.isBidirectional() && (property instanceof HibernateOneToManyProperty)) { throw new DatastoreConfigurationException("Default sort for associations ["+property.getHibernateOwner().getName()+"->" + property.getName() + "] are not supported with unidirectional one to many relationships."); } @@ -118,7 +119,7 @@ public class CollectionSecondPassBinder { new CollectionForPropertyConfigBinder().bindCollectionForPropertyConfig(collection, propConfig); } - final boolean isManyToMany = property instanceof ManyToMany; + final boolean isManyToMany = property instanceof HibernateManyToManyProperty; if(referenced != null && !isManyToMany && referenced.isMultiTenant()) { String filterCondition = referenced.getMultiTenantFilterCondition(defaultColumnNameFetcher); if(filterCondition != null) { @@ -146,7 +147,7 @@ public class CollectionSecondPassBinder { linkBidirectionalOneToMany(collection, associatedClass, key, otherSide); - } else if ((otherSide instanceof ManyToMany) || java.util.Map.class.isAssignableFrom(property.getType())) { + } else if ((otherSide instanceof HibernateManyToManyProperty) || java.util.Map.class.isAssignableFrom(property.getType())) { bindDependentKeyValue(property, key, mappings, sessionFactoryBeanName); @@ -199,7 +200,7 @@ public class CollectionSecondPassBinder { if (!property.shouldBindWithForeignKey()) { bindCollectionWithJoinTable(property, mappings, collection, propConfig); } else { - bindUnidirectionalOneToMany((org.grails.datastore.mapping.model.types.OneToMany) property, mappings, collection); + bindUnidirectionalOneToMany((HibernateOneToManyProperty) property, mappings, collection); } } else if (property.supportsJoinColumnMapping()) { bindCollectionWithJoinTable(property, mappings, collection, propConfig); @@ -207,7 +208,7 @@ public class CollectionSecondPassBinder { forceNullableAndCheckUpdateable(key, property); } - private void bindUnidirectionalOneToMany(org.grails.datastore.mapping.model.types.OneToMany property, @Nonnull InFlightMetadataCollector mappings, Collection collection) { + private void bindUnidirectionalOneToMany(HibernateOneToManyProperty property, @Nonnull InFlightMetadataCollector mappings, Collection collection) { Value v = collection.getElement(); v.createForeignKey(); String entityName; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinder.java index 210d8ae7ad..c9eed1ffee 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/ListSecondPassBinder.java @@ -2,8 +2,8 @@ package org.grails.orm.hibernate.cfg.domainbinding.secondpass; import jakarta.annotation.Nonnull; import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.types.ManyToMany; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.domainbinding.util.BackticksRemover; @@ -48,7 +48,7 @@ public class ListSecondPassBinder { collectionSecondPassBinder.bindCollectionSecondPass(property, mappings, persistentClasses, list, sessionFactoryBeanName); String columnName = property.getIndexColumnName(namingStrategy); - final boolean isManyToMany = property instanceof ManyToMany; + final boolean isManyToMany = property instanceof HibernateManyToManyProperty; if (isManyToMany && !property.isOwningSide()) { throw new MappingException("Invalid association [" + property + diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinder.java index 7060a23d04..4a599afd2c 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/secondpass/MapSecondPassBinder.java @@ -6,6 +6,8 @@ import org.grails.datastore.mapping.model.types.Basic; import org.grails.orm.hibernate.cfg.ColumnConfig; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateToManyProperty; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; @@ -59,7 +61,7 @@ public class MapSecondPassBinder { } map.setIndex(value); - if(!(property instanceof org.grails.datastore.mapping.model.types.OneToMany) && !(property instanceof org.grails.datastore.mapping.model.types.ManyToMany)) { + if(!(property instanceof HibernateOneToManyProperty) && !(property instanceof HibernateManyToManyProperty)) { SimpleValue elt = new BasicValue(metadataBuildingContext, map.getCollectionTable()); map.setElement(elt); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/CascadeBehaviorFetcher.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/CascadeBehaviorFetcher.java index efb795607e..565cc3337a 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/CascadeBehaviorFetcher.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/CascadeBehaviorFetcher.java @@ -7,6 +7,10 @@ import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PropertyConfig; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty; import org.hibernate.MappingException; import org.slf4j.Logger; @@ -55,15 +59,15 @@ public class CascadeBehaviorFetcher { if (association.isHasOne()) { return ALL; } - else if (association.isOneToOne()) { + else if (association instanceof HibernateOneToOneProperty) { return association.isOwningSide() ? ALL : SAVE_UPDATE; } - else if (association.isOneToMany()) { + else if (association instanceof HibernateOneToManyProperty) { return association.isCorrectlyOwned() ? ALL : SAVE_UPDATE; - } else if (association.isManyToMany()) { + } else if (association instanceof HibernateManyToManyProperty) { return association.isCorrectlyOwned() || association.isCircular() ? SAVE_UPDATE :NONE; } - else if (association.isManyToOne()) { + else if (association instanceof HibernateManyToOneProperty) { if ( association.isCorrectlyOwned() && !association.isCircular()) { return ALL; } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java index f7f9eedbf6..2ef617a2a0 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/DefaultColumnNameFetcher.java @@ -2,9 +2,10 @@ package org.grails.orm.hibernate.cfg.domainbinding.util; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.Basic; -import org.grails.datastore.mapping.model.types.ManyToMany; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; public class DefaultColumnNameFetcher { @@ -38,11 +39,11 @@ public class DefaultColumnNameFetcher { return namingStrategyWrapper.resolveForeignKeyForPropertyDomainClass(property); } - if (property instanceof ManyToMany) { + if (property instanceof HibernateManyToManyProperty) { return namingStrategyWrapper.resolveForeignKeyForPropertyDomainClass(property); } - if (!association.isBidirectional() && association instanceof org.grails.datastore.mapping.model.types.OneToMany) { + if (!association.isBidirectional() && association instanceof HibernateOneToManyProperty) { String prefix = namingStrategyWrapper.resolveTableName(property.getOwner().getRootEntity().getJavaClass().getSimpleName()); return backticksRemover.apply(prefix) + UNDERSCORE + backticksRemover.apply(columnName) + FOREIGN_KEY_SUFFIX; } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/LogCascadeMapping.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/LogCascadeMapping.java index 1263051fbc..035ddbe8fa 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/LogCascadeMapping.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/LogCascadeMapping.java @@ -1,10 +1,10 @@ package org.grails.orm.hibernate.cfg.domainbinding.util; import org.grails.datastore.mapping.model.types.Association; -import org.grails.datastore.mapping.model.types.ManyToMany; -import org.grails.datastore.mapping.model.types.ManyToOne; -import org.grails.datastore.mapping.model.types.OneToMany; -import org.grails.datastore.mapping.model.types.OneToOne; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty; import org.slf4j.Logger; @@ -40,16 +40,16 @@ public class LogCascadeMapping { */ private String getAssociationType(Association association) { // Use a standard if-else-if chain for compatibility with Java 17 and earlier. - if (association instanceof ManyToMany) { + if (association instanceof HibernateManyToManyProperty) { return "many-to-many"; } - else if (association instanceof OneToMany) { + else if (association instanceof HibernateOneToManyProperty) { return "one-to-many"; } - else if (association instanceof OneToOne) { + else if (association instanceof HibernateOneToOneProperty) { return "one-to-one"; } - else if (association instanceof ManyToOne) { + else if (association instanceof HibernateManyToOneProperty) { return "many-to-one"; } else if (association.isEmbedded()) { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java index 697be04b96..1756a6900c 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/util/TableForManyCalculator.java @@ -6,12 +6,12 @@ import org.hibernate.MappingException; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.Basic; -import org.grails.datastore.mapping.model.types.ManyToMany; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentEntity; import org.grails.orm.hibernate.cfg.GrailsHibernatePersistentProperty; import org.grails.orm.hibernate.cfg.JoinTable; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.PropertyConfig; +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty; import static org.grails.orm.hibernate.cfg.GrailsDomainBinder.UNDERSCORE; @@ -73,7 +73,7 @@ public class TableForManyCalculator { } String right = tableNameFetcher.getTableName(domainClass); - if (property instanceof ManyToMany property1) { + if (property instanceof HibernateManyToManyProperty property1) { if (hasJoinTableMapping) { return jt.getName(); } 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 96147c4a85..c6dc4a1aed 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 @@ -13,6 +13,10 @@ import org.grails.orm.hibernate.cfg.Mapping import org.grails.orm.hibernate.cfg.MappingCacheHolder import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.PropertyConfig +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty 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 @@ -33,15 +37,15 @@ import org.grails.orm.hibernate.cfg.domainbinding.util.PropertyFromValueCreator class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { - abstract static class TestManyToOne extends GormManyToOne<PropertyConfig> implements GrailsHibernatePersistentProperty { + abstract static class TestManyToOne extends HibernateManyToOneProperty { TestManyToOne(PersistentEntity owner, MappingContext context, java.beans.PropertyDescriptor descriptor) { - super(owner, context, descriptor) + super(owner, context, descriptor); } } - abstract static class TestOneToOne extends GormOneToOne<PropertyConfig> implements GrailsHibernatePersistentProperty { + abstract static class TestOneToOne extends HibernateOneToOneProperty { TestOneToOne(PersistentEntity owner, MappingContext context, java.beans.PropertyDescriptor descriptor) { - super(owner, context, descriptor) + super(owner, context, descriptor); } } @@ -76,7 +80,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { prop.getName() >> name _ * prop.getOwner() >> owner if (prop instanceof GrailsHibernatePersistentProperty) { - _ * prop.getHibernateOwner() >> owner + _ * ((GrailsHibernatePersistentProperty)prop).getHibernateOwner() >> owner } def config = new PropertyConfig() mapping.getColumns().put(name, config) @@ -93,9 +97,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { ownerEntity.isRoot() >> true def currentGrailsProp = Mock(GrailsHibernatePersistentProperty) - _ * currentGrailsProp.getOwner() >> ownerEntity - _ * currentGrailsProp.getHibernateOwner() >> ownerEntity - + def componentProperty = Mock(GrailsHibernatePersistentProperty) def mappings = Mock(InFlightMetadataCollector) def hibernateProperty = new Property() @@ -105,6 +107,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { ownerEntity.getMappedForm() >> mapping currentGrailsProp.getType() >> String setupProperty(currentGrailsProp, "street", mapping, ownerEntity) + setupProperty(componentProperty, "address", mapping, ownerEntity) propertyFromValueCreator.createProperty(_ as BasicValue, currentGrailsProp) >> hibernateProperty @@ -132,8 +135,6 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { def mapping = new Mapping() ownerEntity.getMappedForm() >> mapping - _ * currentGrailsProp.getOwner() >> ownerEntity - _ * currentGrailsProp.getHibernateOwner() >> ownerEntity currentGrailsProp.getAssociatedEntity() >> Mock(GrailsHibernatePersistentEntity) { getName() >> "Owner" getMappedForm() >> new Mapping() @@ -141,6 +142,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { } currentGrailsProp.getType() >> Object setupProperty(currentGrailsProp, "owner", mapping, ownerEntity) + setupProperty(componentProperty, "address", mapping, ownerEntity) propertyFromValueCreator.createProperty(_ as HibernateManyToOne, currentGrailsProp) >> hibernateProperty @@ -168,8 +170,6 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { def mapping = new Mapping() ownerEntity.getMappedForm() >> mapping - _ * currentGrailsProp.getOwner() >> ownerEntity - _ * currentGrailsProp.getHibernateOwner() >> ownerEntity ((Association)currentGrailsProp).getInverseSide() >> Mock(Association) { isHasOne() >> false getOwner() >> Mock(GrailsHibernatePersistentEntity) { @@ -181,6 +181,7 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { currentGrailsProp.getType() >> Object ((Association)currentGrailsProp).canBindOneToOneWithSingleColumnAndForeignKey() >> true setupProperty(currentGrailsProp, "detail", mapping, ownerEntity) + setupProperty(componentProperty, "address", mapping, ownerEntity) propertyFromValueCreator.createProperty(_ as HibernateOneToOne, currentGrailsProp) >> hibernateProperty @@ -208,10 +209,9 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { def mapping = new Mapping() ownerEntity.getMappedForm() >> mapping - _ * currentGrailsProp.getOwner() >> ownerEntity - _ * currentGrailsProp.getHibernateOwner() >> ownerEntity currentGrailsProp.getType() >> MyEnum setupProperty(currentGrailsProp, "type", mapping, ownerEntity) + setupProperty(componentProperty, "address", mapping, ownerEntity) namingStrategy.resolveColumnName("type") >> "type_col" namingStrategy.resolveColumnName("address") >> "address" @@ -234,20 +234,16 @@ class ComponentPropertyBinderSpec extends HibernateGormDatastoreSpec { ownerEntity.isRoot() >> true def currentGrailsProp = Mock(GrailsHibernatePersistentProperty) def componentProperty = Mock(GrailsHibernatePersistentProperty) - def ownerEntityGHPE = Mock(GrailsHibernatePersistentEntity) - ownerEntityGHPE.isRoot() >> true def mappings = Mock(InFlightMetadataCollector) def hibernateProperty = new Property() hibernateProperty.setName("street") def mapping = new Mapping() - ownerEntityGHPE.getMappedForm() >> mapping - _ * currentGrailsProp.getOwner() >> ownerEntityGHPE - _ * currentGrailsProp.getHibernateOwner() >> ownerEntityGHPE + ownerEntity.getMappedForm() >> mapping currentGrailsProp.getType() >> String - setupProperty(currentGrailsProp, "street", mapping, ownerEntityGHPE) + setupProperty(currentGrailsProp, "street", mapping, ownerEntity) + setupProperty(componentProperty, "address", mapping, ownerEntity) - componentProperty.getOwner() >> ownerEntity ownerEntity.isComponentPropertyNullable(componentProperty) >> true propertyFromValueCreator.createProperty(_ as BasicValue, currentGrailsProp) >> hibernateProperty diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/LogCascadeMappingSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/LogCascadeMappingSpec.groovy index e27d73e04a..93af4ab269 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/LogCascadeMappingSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/LogCascadeMappingSpec.groovy @@ -6,6 +6,10 @@ import org.grails.datastore.mapping.model.types.ManyToMany import org.grails.datastore.mapping.model.types.ManyToOne import org.grails.datastore.mapping.model.types.OneToMany import org.grails.datastore.mapping.model.types.OneToOne +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty import org.slf4j.Logger import spock.lang.Specification import spock.lang.Subject @@ -46,11 +50,11 @@ class LogCascadeMappingSpec extends Specification { typeDescription, "OwnerClass", "testProperty", TargetClass.name, cascadeBehavior) where: - associationClass | typeDescription - ManyToMany | "many-to-many" - OneToMany | "one-to-many" - OneToOne | "one-to-one" - ManyToOne | "many-to-one" + associationClass | typeDescription + HibernateManyToManyProperty | "many-to-many" + HibernateOneToManyProperty | "one-to-many" + HibernateOneToOneProperty | "one-to-one" + HibernateManyToOneProperty | "many-to-one" } def "should log unknown for unrecognized association type"() { diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy index 4f9fe62170..b5102ed33d 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinderSpec.groovy @@ -2,14 +2,16 @@ package org.grails.orm.hibernate.cfg.domainbinding import grails.gorm.specs.HibernateGormDatastoreSpec import org.grails.datastore.mapping.model.types.Association -import org.grails.datastore.mapping.model.types.ManyToMany -import org.grails.datastore.mapping.model.types.OneToOne 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.Mapping import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy import org.grails.orm.hibernate.cfg.PropertyConfig +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToManyProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateManyToOneProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToManyProperty +import org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernateOneToOneProperty import org.hibernate.MappingException import org.hibernate.mapping.Column import org.hibernate.mapping.ManyToOne @@ -34,7 +36,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, manyToOneValuesBinder, compositeBinder, columnFetcher) - def association = Mock(Association, additionalInterfaces: [GrailsHibernatePersistentProperty]) + def association = Mock(HibernateManyToOneProperty) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) def path = "/test" def mapping = new Mapping() @@ -44,7 +46,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def propertyConfig = new PropertyConfig() association.getAssociatedEntity() >> refDomainClass - ((GrailsHibernatePersistentProperty)association).getMappedForm() >> propertyConfig + association.getMappedForm() >> propertyConfig mapping.setIdentity(hasCompositeId ? new CompositeIdentity() : null) when: @@ -52,7 +54,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { then: 1 * manyToOneValuesBinder.bindManyToOneValues(association as Association, manyToOne) - compositeBinderCalls * compositeBinder.bindCompositeIdentifierToManyToOne(association as Association, manyToOne, _, refDomainClass, path) + compositeBinderCalls * compositeBinder.bindCompositeIdentifierToManyToOne(association as GrailsHibernatePersistentProperty, manyToOne, _, refDomainClass, path) simpleValueBinderCalls * simpleValueBinder.bindSimpleValue(association as GrailsHibernatePersistentProperty, null, manyToOne, path) where: @@ -71,7 +73,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, manyToOneValuesBinder, compositeBinder, columnFetcher) - def property = Mock(ManyToMany, additionalInterfaces: [GrailsHibernatePersistentProperty]) + def property = Mock(HibernateManyToManyProperty) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) def mapping = new Mapping() mapping.setColumns(new HashMap<String, PropertyConfig>()) @@ -83,7 +85,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { property.isCircular() >> true property.getOwner() >> ownerEntity property.getName() >> "myCircularProp" - ((GrailsHibernatePersistentProperty)property).getMappedForm() >> propertyConfig + property.getMappedForm() >> propertyConfig namingStrategy.resolveColumnName("myCircularProp") >> "my_circular_prop" when: @@ -108,7 +110,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, manyToOneValuesBinder, compositeBinder, columnFetcher) - def property = Mock(OneToOne, additionalInterfaces: [GrailsHibernatePersistentProperty]) + def property = Mock(HibernateOneToOneProperty) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) def mapping = new Mapping() def refDomainClass = Mock(GrailsHibernatePersistentEntity) { @@ -120,7 +122,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { property.getAssociatedEntity() >> refDomainClass mapping.setIdentity(null) - ((GrailsHibernatePersistentProperty)property).getMappedForm() >> propertyConfig + property.getMappedForm() >> propertyConfig columnFetcher.getColumnForSimpleValue(manyToOne) >> column propertyConfig.isUnique() >> isUnique @@ -159,7 +161,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, manyToOneValuesBinder, compositeBinder, columnFetcher) - def property = Mock(OneToOne, additionalInterfaces: [GrailsHibernatePersistentProperty]) + def property = Mock(HibernateOneToOneProperty) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) def mapping = new Mapping() def refDomainClass = Mock(GrailsHibernatePersistentEntity) { @@ -169,7 +171,7 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { property.getAssociatedEntity() >> refDomainClass mapping.setIdentity(null) - ((GrailsHibernatePersistentProperty)property).getMappedForm() >> propertyConfig + property.getMappedForm() >> propertyConfig columnFetcher.getColumnForSimpleValue(manyToOne) >> null when:
