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 1096dd6b289b9a50dfa463e97368e82a5e613390 Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Sun Jan 25 17:48:23 2026 -0600 I have refactored the Hibernate 7 module to remove the need for HibernateEntityWrapper by introducing a more direct way to access the mapped form of an entity through the PersistentEntity hierarchy. Key changes: - `grails-datastore-core`: - Added a default method getMappedForm() to the PersistentEntity interface, providing a common contract for retrieving the underlying mapping. - Made EmbeddedPersistentEntity generic (EmbeddedPersistentEntity<T extends Entity>), allowing it to correctly propagate mapping type information. - `hibernate7` module: - Updated HibernatePersistentEntity and HibernateEmbeddedPersistentEntity to specify Mapping as their generic type. - Refactored GrailsDomainBinder.getMapping(PersistentEntity) to utilize the new getMappedForm() method, falling back to the mapping cache if necessary. - Replaced all 13 occurrences of HibernateEntityWrapper in GrailsDomainBinder with direct calls to getMapping(domainClass). - Refactored TableNameFetcher, SimpleIdBinder, EnumTypeBinder, CascadeBehaviorFetcher, ManyToOneBinder, SimpleValueBinder, and ColumnBinder to eliminate dependencies on HibernateEntityWrapper. - Deleted the now-obsolete HibernateEntityWrapper.java and its corresponding test spec. - Updated all relevant test specifications to use the refactored mapping retrieval logic. These changes ensure a cleaner architectural integration between the core datastore and the Hibernate-specific implementation while maintaining full compatibility across the module hierarchy. All relevant tests have been verified. --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 54 ++++--- .../cfg/HibernateEmbeddedPersistentEntity.java | 46 ++++++ .../orm/hibernate/cfg/HibernateMappingContext.java | 38 ----- .../cfg/domainbinding/CascadeBehaviorFetcher.java | 3 +- .../hibernate/cfg/domainbinding/ColumnBinder.java | 7 +- .../ColumnNameForPropertyAndPathFetcher.java | 4 - .../cfg/domainbinding/EnumTypeBinder.java | 3 +- .../cfg/domainbinding/HibernateEntityWrapper.java | 31 ---- .../cfg/domainbinding/ManyToOneBinder.java | 9 +- .../cfg/domainbinding/SimpleIdBinder.java | 8 +- .../cfg/domainbinding/SimpleValueBinder.java | 7 +- .../cfg/domainbinding/TableNameFetcher.java | 10 +- .../grails/orm/hibernate/cfg/MappingSpec.groovy | 3 +- .../cfg/domainbinding/ColumnBinderSpec.groovy | 32 +---- .../ColumnNameForPropertyAndPathFetcherSpec.groovy | 8 -- .../HibernateEntityWrapperSpec.groovy | 158 --------------------- .../cfg/domainbinding/ManyToOneBinderSpec.groovy | 32 ++--- .../cfg/domainbinding/SimpleIdBinderSpec.groovy | 26 ++-- .../cfg/domainbinding/SimpleValueBinderSpec.groovy | 12 +- .../cfg/domainbinding/TableNameFetcherSpec.groovy | 9 +- .../mapping/model/AbstractPersistentEntity.java | 2 + .../mapping/model/EmbeddedPersistentEntity.java | 3 +- .../datastore/mapping/model/PersistentEntity.java | 9 ++ 23 files changed, 149 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 29c0290983..649a3d6389 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 @@ -183,7 +183,12 @@ public class GrailsDomainBinder * @return A Mapping object or null */ public static Mapping getMapping(PersistentEntity domainClass) { - return domainClass == null ? null : MAPPING_CACHE.get(domainClass.getJavaClass()); + if (domainClass == null) return null; + org.grails.datastore.mapping.config.Entity mappedForm = domainClass.getMappedForm(); + if (mappedForm instanceof Mapping) { + return (Mapping) mappedForm; + } + return MAPPING_CACHE.get(domainClass.getJavaClass()); } public static void clearMappingCache() { @@ -325,7 +330,7 @@ public class GrailsDomainBinder SimpleValue elt = new BasicValue(metadataBuildingContext, map.getCollectionTable()); map.setElement(elt); - Mapping mapping = new HibernateEntityWrapper().getMappedForm(property.getOwner()); + Mapping mapping = getMapping(property.getOwner()); String typeName = new TypeNameProvider().getTypeName(property, mapping); if (typeName == null ) { @@ -777,7 +782,7 @@ public class GrailsDomainBinder } else { - Mapping mapping = new HibernateEntityWrapper().getMappedForm(property.getOwner());; + Mapping mapping = getMapping(property.getOwner());; String typeName = new TypeNameProvider().getTypeName(property, mapping); if (typeName == null) { Type type = mappings.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType(className); @@ -801,7 +806,7 @@ public class GrailsDomainBinder } else { final PersistentEntity domainClass = property.getAssociatedEntity(); - Mapping m = new HibernateEntityWrapper().getMappedForm(domainClass); + Mapping m = getMapping(domainClass); if (m.hasCompositeIdentifier()) { CompositeIdentity ci = (CompositeIdentity) m.getIdentity(); new CompositeIdentifierToManyToOneBinder(namingStrategy).bindCompositeIdentifierToManyToOne(property, element, ci, domainClass, EMPTY_PATH); @@ -861,7 +866,7 @@ public class GrailsDomainBinder } PersistentEntity refDomainClass = property.getOwner(); - final Mapping mapping = new HibernateEntityWrapper().getMappedForm(refDomainClass); + final Mapping mapping = getMapping(refDomainClass); boolean hasCompositeIdentifier = mapping.hasCompositeIdentifier(); if ((new ShouldCollectionBindWithJoinColumn().apply((ToMany) property) && hasCompositeIdentifier) || (hasCompositeIdentifier && ( property instanceof ManyToMany))) { @@ -1137,7 +1142,7 @@ public class GrailsDomainBinder public void evaluateMapping(PersistentEntity persistentEntity) { Optional.ofNullable(persistentEntity).ifPresent(domainClass -> { try { - final Mapping m = new HibernateEntityWrapper().getMappedForm(domainClass); + final Mapping m = getMapping(domainClass); for (PersistentProperty property : domainClass.getPersistentProperties()) { PropertyConfig propConf = m.getPropertyConfig(property.getName()); @@ -1180,7 +1185,7 @@ public class GrailsDomainBinder root.setPolymorphic(false); } else { root.setPolymorphic(true); - Mapping m = new HibernateEntityWrapper().getMappedForm(entity); + Mapping m = getMapping(entity); boolean tablePerSubclass = !m.getTablePerHierarchy(); if (!tablePerSubclass) { // if the root class has children create a discriminator property @@ -1296,7 +1301,7 @@ public class GrailsDomainBinder // set the descriminator value as the name of the class. This is the // value used by Hibernate to decide what the type of the class is // to perform polymorphic queries - Mapping subMapping = new HibernateEntityWrapper().getMappedForm(sub); + Mapping subMapping = getMapping(sub); DiscriminatorConfig discriminatorConfig = subMapping.getDiscriminator(); subClass.setDiscriminatorValue(discriminatorConfig != null && discriminatorConfig.getValue() != null ? discriminatorConfig.getValue() : fullName); @@ -1348,7 +1353,7 @@ public class GrailsDomainBinder InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { classBinding.bindClass(subClass, unionSubclass, mappings); - Mapping subMapping = new HibernateEntityWrapper().getMappedForm(subClass); + Mapping subMapping = getMapping(subClass); //TODO Verify if needed at all // if ( unionSubclass.getEntityPersisterClass() == null ) { @@ -1517,7 +1522,7 @@ public class GrailsDomainBinder RootClass root, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { // get the schema and catalog names from the configuration - Mapping gormMapping = new HibernateEntityWrapper().getMappedForm(domainClass); + Mapping gormMapping = getMapping(domainClass); configureDerivedProperties(domainClass, gormMapping); CacheConfig cc = gormMapping.getCache(); @@ -1641,7 +1646,7 @@ public class GrailsDomainBinder private void createClassProperties(HibernatePersistentEntity domainClass, PersistentClass persistentClass, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { - Mapping gormMapping = new HibernateEntityWrapper().getMappedForm(domainClass); + Mapping gormMapping = getMapping(domainClass); Table table = persistentClass.getTable(); table.setComment(gormMapping.getComment()); final List<PersistentProperty> persistentProperties = domainClass.getPersistentProperties() @@ -1897,8 +1902,8 @@ public class GrailsDomainBinder private boolean isComponentPropertyNullable(PersistentProperty componentProperty) { if (componentProperty == null) return false; - final HibernatePersistentEntity domainClass = (HibernatePersistentEntity) componentProperty.getOwner(); - final Mapping mapping = new HibernateEntityWrapper().getMappedForm(domainClass); + final PersistentEntity domainClass = componentProperty.getOwner(); + final Mapping mapping = getMapping(domainClass); return !domainClass.isRoot() && (mapping == null || mapping.isTablePerHierarchy()) || componentProperty.isNullable(); } @@ -1970,14 +1975,21 @@ public class GrailsDomainBinder return getNamingStrategy().resolveColumnName(property.getName()) + UNDERSCORE + IndexedCollection.DEFAULT_INDEX_COLUMN_NAME; } - private String getIndexColumnType(PersistentProperty property, String defaultType) { - PropertyConfig pc = new PersistentPropertyToPropertyConfig().toPropertyConfig(property); - if (pc.getIndexColumn() != null && pc.getIndexColumn().getType() != null) { - Mapping mapping =new HibernateEntityWrapper().getMappedForm(property.getOwner()); - return new TypeNameProvider().getTypeName(property, mapping); + private String getIndexColumnType(PersistentProperty property, String defaultType) { + + PropertyConfig pc = new PersistentPropertyToPropertyConfig().toPropertyConfig(property); + + if (pc.getIndexColumn() != null && pc.getIndexColumn().getType() != null) { + + Mapping mapping = getMapping(property.getOwner()); + + return new TypeNameProvider().getTypeName(property, mapping); + + } + + return defaultType; + } - return defaultType; - } private String getMapElementName(PersistentProperty property, String sessionFactoryBeanName) { PropertyConfig pc = new PersistentPropertyToPropertyConfig().toPropertyConfig(property); @@ -2223,7 +2235,7 @@ public class GrailsDomainBinder } public String getTypeName(ToMany property) { - Mapping mapping = new HibernateEntityWrapper().getMappedForm(property.getOwner()); + Mapping mapping = getMapping(property.getOwner()); return new TypeNameProvider().getTypeName(property, mapping); } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateEmbeddedPersistentEntity.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateEmbeddedPersistentEntity.java new file mode 100644 index 0000000000..f1b677338d --- /dev/null +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateEmbeddedPersistentEntity.java @@ -0,0 +1,46 @@ +package org.grails.orm.hibernate.cfg; + +import org.grails.datastore.mapping.model.ClassMapping; +import org.grails.datastore.mapping.model.EmbeddedPersistentEntity; +import org.grails.datastore.mapping.model.IdentityMapping; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.PersistentEntity; + +public class HibernateEmbeddedPersistentEntity extends EmbeddedPersistentEntity<Mapping> { + private final ClassMapping<Mapping> classMapping; + + public Mapping getMappedForm() { + return classMapping.getMappedForm(); + } + + public HibernateEmbeddedPersistentEntity(Class type, MappingContext ctx) { + super(type, ctx); + this.classMapping = new ClassMapping<Mapping>() { + Mapping mappedForm = (Mapping) context.getMappingFactory().createMappedForm(HibernateEmbeddedPersistentEntity.this); + + @Override + public PersistentEntity getEntity() { + return HibernateEmbeddedPersistentEntity.this; + } + + @Override + public Mapping getMappedForm() { + return mappedForm; + } + + @Override + public IdentityMapping getIdentifier() { + return null; + } + + + }; + + + } + + @Override + public ClassMapping getMapping() { + return classMapping; + } +} diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java index 5e6727b4fd..cde929dd87 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java @@ -199,44 +199,6 @@ public class HibernateMappingContext extends AbstractMappingContext { .toList(); } - public static class HibernateEmbeddedPersistentEntity extends EmbeddedPersistentEntity { - private final ClassMapping<Mapping> classMapping; - - public Mapping getMappedForm() { - return classMapping.getMappedForm(); - } - - public HibernateEmbeddedPersistentEntity(Class type, MappingContext ctx) { - super(type, ctx); - this.classMapping = new ClassMapping<Mapping>() { - Mapping mappedForm = (Mapping) context.getMappingFactory().createMappedForm(HibernateEmbeddedPersistentEntity.this); - @Override - public PersistentEntity getEntity() { - return HibernateEmbeddedPersistentEntity.this; - } - - @Override - public Mapping getMappedForm() { - return mappedForm; - } - - @Override - public IdentityMapping getIdentifier() { - return null; - } - - - }; - - - } - - @Override - public ClassMapping getMapping() { - return classMapping; - } - } - class HibernateMappingFactory extends AbstractGormMappingFactory<Mapping,PropertyConfig> { public HibernateMappingFactory() { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcher.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcher.java index b48faaa982..ef1f0d0fbb 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcher.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/CascadeBehaviorFetcher.java @@ -4,6 +4,7 @@ import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.model.types.Basic; import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PropertyConfig; import org.hibernate.MappingException; @@ -84,7 +85,7 @@ public class CascadeBehaviorFetcher { } private Mapping getOwnersWrappedForm(Association<?> association) { - return new HibernateEntityWrapper().getMappedForm(association.getOwner()); + return GrailsDomainBinder.getMapping(association.getOwner()); } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinder.java index 1461e1a743..db7b5cee35 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinder.java @@ -12,6 +12,7 @@ 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.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.PropertyConfig; @@ -25,7 +26,6 @@ public class ColumnBinder { private final StringColumnConstraintsBinder stringColumnConstraintsBinder; private final NumericColumnConstraintsBinder numericColumnConstraintsBinder; private final CreateKeyForProps createKeyForProps; - private final HibernateEntityWrapper hibernateEntityWrapper; private final UserTypeFetcher userTypeFetcher; private final IndexBinder indexBinder; @@ -35,7 +35,6 @@ public class ColumnBinder { this.stringColumnConstraintsBinder = new StringColumnConstraintsBinder(); this.numericColumnConstraintsBinder = new NumericColumnConstraintsBinder(); this.createKeyForProps = new CreateKeyForProps(columnNameForPropertyAndPathFetcher); - this.hibernateEntityWrapper = new HibernateEntityWrapper(); this.userTypeFetcher = new UserTypeFetcher(); this.indexBinder = new IndexBinder(); } @@ -44,7 +43,6 @@ public class ColumnBinder { , StringColumnConstraintsBinder stringColumnConstraintsBinder , NumericColumnConstraintsBinder numericColumnConstraintsBinder , CreateKeyForProps createKeyForProps - , HibernateEntityWrapper hibernateEntityWrapper , UserTypeFetcher userTypeFetcher , IndexBinder indexBinder) { this.columnNameForPropertyAndPathFetcher = columnNameForPropertyAndPathFetcher; @@ -52,7 +50,6 @@ public class ColumnBinder { this.stringColumnConstraintsBinder = stringColumnConstraintsBinder; this.numericColumnConstraintsBinder = numericColumnConstraintsBinder; this.createKeyForProps = createKeyForProps; - this.hibernateEntityWrapper = hibernateEntityWrapper; this.userTypeFetcher = userTypeFetcher; this.indexBinder = indexBinder; } @@ -122,7 +119,7 @@ public class ColumnBinder { final PersistentEntity owner = property.getOwner(); if (!owner.isRoot()) { - Mapping mapping = hibernateEntityWrapper.getMappedForm(owner); + Mapping mapping = GrailsDomainBinder.getMapping(owner); if (mapping.getTablePerHierarchy()) { if (LOG.isDebugEnabled()) LOG.debug("[GrailsDomainBinder] Sub class property [" + property.getName() + "] for column name ["+column.getName()+"] set to nullable"); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcher.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcher.java index 00a7785644..5f38f9d548 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcher.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcher.java @@ -9,7 +9,6 @@ import org.grails.orm.hibernate.cfg.PropertyConfig; public class ColumnNameForPropertyAndPathFetcher { private final PersistentEntityNamingStrategy namingStrategy; - private final HibernateEntityWrapper hibernateEntityWrapper; private final PersistentPropertyToPropertyConfig persistentPropertyToPropertyConfig; private final DefaultColumnNameFetcher defaultColumnNameFetcher; private final BackticksRemover backticksRemover; @@ -17,19 +16,16 @@ public class ColumnNameForPropertyAndPathFetcher { public ColumnNameForPropertyAndPathFetcher(PersistentEntityNamingStrategy namingStrategy ) { this.namingStrategy = namingStrategy; - this.hibernateEntityWrapper = new HibernateEntityWrapper(); this.persistentPropertyToPropertyConfig = new PersistentPropertyToPropertyConfig(); this.defaultColumnNameFetcher = new DefaultColumnNameFetcher(namingStrategy); this.backticksRemover = new BackticksRemover(); } protected ColumnNameForPropertyAndPathFetcher(PersistentEntityNamingStrategy namingStrategy - , HibernateEntityWrapper hibernateEntityWrapper , PersistentPropertyToPropertyConfig persistentPropertyToPropertyConfig , DefaultColumnNameFetcher defaultColumnNameFetcher , BackticksRemover backticksRemover) { this.namingStrategy = namingStrategy; - this.hibernateEntityWrapper = hibernateEntityWrapper; this.persistentPropertyToPropertyConfig = persistentPropertyToPropertyConfig; this.defaultColumnNameFetcher = defaultColumnNameFetcher; this.backticksRemover = backticksRemover; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java index 2bf95a3032..004336738c 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java @@ -2,6 +2,7 @@ package org.grails.orm.hibernate.cfg.domainbinding; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.orm.hibernate.cfg.ColumnConfig; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.IdentityEnumType; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PropertyConfig; @@ -39,7 +40,7 @@ public class EnumTypeBinder { public void bindEnumType(PersistentProperty property, Class<?> propertyType, SimpleValue simpleValue, String columnName) { PropertyConfig pc = new PersistentPropertyToPropertyConfig().toPropertyConfig(property); - Mapping ownerMapping = new HibernateEntityWrapper().getMappedForm(property.getOwner()); + Mapping ownerMapping = GrailsDomainBinder.getMapping(property.getOwner()); String enumType = pc.getEnumType(); Properties enumProperties = new Properties(); enumProperties.put(ENUM_CLASS_PROP, propertyType.getName()); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapper.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapper.java deleted file mode 100644 index 76c6525603..0000000000 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.grails.orm.hibernate.cfg.domainbinding; - -import org.grails.datastore.mapping.model.ClassMapping; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.orm.hibernate.cfg.HibernateMappingContext; -import org.grails.orm.hibernate.cfg.HibernatePersistentEntity; -import org.grails.orm.hibernate.cfg.Mapping; -import org.hibernate.MappingException; - -import java.util.Optional; - -import jakarta.annotation.Nonnull; - -/** - * This class exists because Embedded Entities do not inherit - * from HibernatePersistentEntity but have similar functionality. - */ -public class HibernateEntityWrapper { - - @Nonnull - public Mapping getMappedForm(PersistentEntity persistentEntity) { - if (persistentEntity instanceof HibernatePersistentEntity _hibernatePersistentEntity) { - return _hibernatePersistentEntity.getMappedForm(); - } else if (persistentEntity instanceof HibernateMappingContext.HibernateEmbeddedPersistentEntity embedded) { - return embedded.getMappedForm(); - } else { - throw new MappingException("Not correct Persistent Entity"); - } - } - -} diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinder.java index d2bf5b5b74..86529f5902 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/ManyToOneBinder.java @@ -11,6 +11,7 @@ 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.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.JoinTable; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; @@ -26,7 +27,6 @@ public class ManyToOneBinder { private final ManyToOneValuesBinder manyToOneValuesBinder; private final CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder; private final SimpleValueColumnFetcher simpleValueColumnFetcher; - private final HibernateEntityWrapper hibernateEntityWrapper; public ManyToOneBinder(PersistentEntityNamingStrategy namingStrategy) { this.namingStrategy = namingStrategy; @@ -35,7 +35,6 @@ public class ManyToOneBinder { this.manyToOneValuesBinder = new ManyToOneValuesBinder(); this.compositeIdentifierToManyToOneBinder = new CompositeIdentifierToManyToOneBinder(namingStrategy); this.simpleValueColumnFetcher = new SimpleValueColumnFetcher(); - this.hibernateEntityWrapper = new HibernateEntityWrapper(); } protected ManyToOneBinder(PersistentEntityNamingStrategy namingStrategy @@ -43,15 +42,13 @@ public class ManyToOneBinder { , PersistentPropertyToPropertyConfig persistentPropertyToPropertyConfig , ManyToOneValuesBinder manyToOneValuesBinder , CompositeIdentifierToManyToOneBinder compositeIdentifierToManyToOneBinder - , SimpleValueColumnFetcher simpleValueColumnFetcher - , HibernateEntityWrapper hibernateEntityWrapper) { + , SimpleValueColumnFetcher simpleValueColumnFetcher) { this.namingStrategy = namingStrategy; this.simpleValueBinder =simpleValueBinder; this.persistentPropertyToPropertyConfig = persistentPropertyToPropertyConfig; this.manyToOneValuesBinder = manyToOneValuesBinder; this.compositeIdentifierToManyToOneBinder = compositeIdentifierToManyToOneBinder; this.simpleValueColumnFetcher = simpleValueColumnFetcher; - this.hibernateEntityWrapper = hibernateEntityWrapper; } @@ -65,7 +62,7 @@ public class ManyToOneBinder { ,String path) { manyToOneValuesBinder.bindManyToOneValues(property, manyToOne); PersistentEntity refDomainClass = property instanceof ManyToMany ? property.getOwner() : property.getAssociatedEntity(); - Mapping mapping = hibernateEntityWrapper.getMappedForm(refDomainClass); + Mapping mapping = GrailsDomainBinder.getMapping(refDomainClass); boolean isComposite = mapping.hasCompositeIdentifier(); if (isComposite) { diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java index f5c4b50b07..b1ffba9195 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinder.java @@ -9,6 +9,7 @@ import org.hibernate.mapping.RootClass; import org.hibernate.mapping.Table; import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.HibernatePersistentEntity; import org.grails.orm.hibernate.cfg.Identity; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; @@ -18,20 +19,17 @@ import static org.grails.orm.hibernate.cfg.GrailsDomainBinder.EMPTY_PATH; public class SimpleIdBinder { private final BasicValueIdCreator basicValueIdCreator; - private final HibernateEntityWrapper hibernateEntityWrapper; private final SimpleValueBinder simpleValueBinder; private final PropertyBinder propertyBinder; public SimpleIdBinder(MetadataBuildingContext metadataBuildingContext, PersistentEntityNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment, HibernatePersistentEntity domainClass, RootClass entity) { this.basicValueIdCreator = new BasicValueIdCreator(metadataBuildingContext, jdbcEnvironment, domainClass, entity); - this.hibernateEntityWrapper = new HibernateEntityWrapper(); this.simpleValueBinder =new SimpleValueBinder(namingStrategy); this.propertyBinder = new PropertyBinder(); } - protected SimpleIdBinder(BasicValueIdCreator basicValueIdCreate, HibernateEntityWrapper hibernateEntityWrapper, SimpleValueBinder simpleValueBinder, PropertyBinder propertyBinder) { + protected SimpleIdBinder(BasicValueIdCreator basicValueIdCreate, SimpleValueBinder simpleValueBinder, PropertyBinder propertyBinder) { this.basicValueIdCreator = basicValueIdCreate; - this.hibernateEntityWrapper = hibernateEntityWrapper; this.simpleValueBinder = simpleValueBinder; this.propertyBinder = propertyBinder; } @@ -39,7 +37,7 @@ public class SimpleIdBinder { public void bindSimpleId(PersistentProperty identifier, RootClass entity, Identity mappedId) { - boolean useSequence = hibernateEntityWrapper.getMappedForm(identifier.getOwner()).isTablePerConcreteClass(); + boolean useSequence = GrailsDomainBinder.getMapping(identifier.getOwner()).isTablePerConcreteClass(); // create the id value BasicValue id = basicValueIdCreator.getBasicValueId(entity, mappedId, useSequence); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinder.java index 764ba7725a..d0dc7fa123 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinder.java @@ -14,6 +14,7 @@ import org.hibernate.mapping.Table; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.types.TenantId; import org.grails.orm.hibernate.cfg.ColumnConfig; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.PropertyConfig; @@ -23,7 +24,6 @@ public class SimpleValueBinder { private final ColumnConfigToColumnBinder columnConfigToColumnBinder ; private final ColumnBinder columnBinder; private final PersistentPropertyToPropertyConfig persistentPropertyToPropertyConfig; - private final HibernateEntityWrapper hibernateEntityWrapper; private final TypeNameProvider typeNameProvider; @@ -33,7 +33,6 @@ public class SimpleValueBinder { this.columnConfigToColumnBinder = new ColumnConfigToColumnBinder(); this.columnBinder = new ColumnBinder(namingStrategy); this.persistentPropertyToPropertyConfig = new PersistentPropertyToPropertyConfig(); - this.hibernateEntityWrapper = new HibernateEntityWrapper(); this.typeNameProvider = new TypeNameProvider(); } @@ -41,13 +40,11 @@ public class SimpleValueBinder { protected SimpleValueBinder(ColumnConfigToColumnBinder columnConfigToColumnBinder , ColumnBinder columnBinder , PersistentPropertyToPropertyConfig persistentPropertyToPropertyConfig - , HibernateEntityWrapper hibernateEntityWrapper ,TypeNameProvider typeNameProvider) { this.columnConfigToColumnBinder = columnConfigToColumnBinder; this.columnBinder = columnBinder; this.persistentPropertyToPropertyConfig = persistentPropertyToPropertyConfig; this.typeNameProvider = typeNameProvider; - this.hibernateEntityWrapper = hibernateEntityWrapper; } @@ -68,7 +65,7 @@ public class SimpleValueBinder { , String path ) { PropertyConfig propertyConfig = persistentPropertyToPropertyConfig.toPropertyConfig(property); - Mapping mapping = hibernateEntityWrapper.getMappedForm(property.getOwner()); + Mapping mapping = GrailsDomainBinder.getMapping(property.getOwner()); final String typeName = typeNameProvider.getTypeName(property, mapping); if (typeName == null) { simpleValue.setTypeName(property.getType().getName()); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcher.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcher.java index 56153e3ffc..a66fcc3170 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcher.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcher.java @@ -3,6 +3,7 @@ package org.grails.orm.hibernate.cfg.domainbinding; import java.util.Optional; import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; @@ -13,20 +14,13 @@ import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; public class TableNameFetcher { private final PersistentEntityNamingStrategy persistentEntityNamingStrategy; - private final HibernateEntityWrapper hibernateEntityWrapper; public TableNameFetcher(PersistentEntityNamingStrategy persistentEntityNamingStrategy) { this.persistentEntityNamingStrategy = persistentEntityNamingStrategy; - this.hibernateEntityWrapper = new HibernateEntityWrapper(); - } - - protected TableNameFetcher(PersistentEntityNamingStrategy persistentEntityNamingStrategy, HibernateEntityWrapper hibernateEntityWrapper) { - this.persistentEntityNamingStrategy = persistentEntityNamingStrategy; - this.hibernateEntityWrapper = hibernateEntityWrapper; } public String getTableName(PersistentEntity domainClass) { - var tableName = hibernateEntityWrapper.getMappedForm(domainClass).getTableName(); + var tableName = GrailsDomainBinder.getMapping(domainClass).getTableName(); return tableName != null ? tableName :persistentEntityNamingStrategy.resolveTableName(domainClass); } } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/MappingSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/MappingSpec.groovy index 4eceb13502..c6aa7e4ba6 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/MappingSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/MappingSpec.groovy @@ -2,7 +2,6 @@ package org.grails.orm.hibernate.cfg import grails.gorm.annotation.Entity import grails.gorm.specs.HibernateGormDatastoreSpec -import org.grails.orm.hibernate.cfg.domainbinding.HibernateEntityWrapper import spock.lang.Unroll /** @@ -17,7 +16,7 @@ class MappingSpec extends HibernateGormDatastoreSpec { // Ensure all related entities are processed by the mapping context createPersistentEntity(Author, binder) def entity = createPersistentEntity(domainClass, binder) - def mapping = new HibernateEntityWrapper().getMappedForm(entity) + def mapping = (Mapping) entity.getMappedForm() def property = entity.getPropertyByName(propertyName) when: "The method is called on the mapping object" diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinderSpec.groovy index 2ff413fc7c..398ce49631 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnBinderSpec.groovy @@ -21,7 +21,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -32,7 +31,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -73,7 +71,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -84,7 +81,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -106,7 +102,7 @@ class ColumnBinderSpec extends Specification { parentProp.isNullable() >> true // should make column initially nullable prop.getOwner() >> owner owner.isRoot() >> false - hibernateWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping mapping.getTablePerHierarchy() >> true // forces nullable true for subclass propToConfig.toPropertyConfig(prop) >>> [propertyConfig, propertyConfig] // called twice in code // numeric constraints applied @@ -139,7 +135,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -150,7 +145,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -196,7 +190,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -207,7 +200,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -248,7 +240,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -259,7 +250,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -304,7 +294,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -315,7 +304,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -356,7 +344,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -367,7 +354,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -409,7 +395,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -420,7 +405,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -462,7 +446,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -473,7 +456,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -513,7 +495,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -524,7 +505,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -564,7 +544,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -575,7 +554,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -613,7 +591,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -624,7 +601,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -664,7 +640,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -675,7 +650,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -714,7 +688,6 @@ class ColumnBinderSpec extends Specification { def stringBinder = Mock(StringColumnConstraintsBinder) def numericBinder = Mock(NumericColumnConstraintsBinder) def keyCreator = Mock(CreateKeyForProps) - def hibernateWrapper = Mock(HibernateEntityWrapper) def userTypeFetcher = Mock(UserTypeFetcher) def indexBinder = Mock(IndexBinder) @@ -725,7 +698,6 @@ class ColumnBinderSpec extends Specification { stringBinder, numericBinder, keyCreator, - hibernateWrapper, userTypeFetcher, indexBinder ) @@ -743,7 +715,7 @@ class ColumnBinderSpec extends Specification { prop.isNullable() >> false prop.getOwner() >> owner owner.isRoot() >> false - hibernateWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping mapping.getTablePerHierarchy() >> false propToConfig.toPropertyConfig(prop) >>> [propertyConfig, propertyConfig] propertyConfig.isUnique() >> false diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcherSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcherSpec.groovy index 57c5692c19..ed963ccef9 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcherSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ColumnNameForPropertyAndPathFetcherSpec.groovy @@ -16,12 +16,10 @@ class ColumnNameForPropertyAndPathFetcherSpec extends Specification { def "when ColumnConfig is null and mapping has explicit column then it is used"() { given: def namingStrategy = Mock(PersistentEntityNamingStrategy) - def hibernateEntityWrapper = Mock(HibernateEntityWrapper) def propToConfig = Mock(PersistentPropertyToPropertyConfig) def defaultColumnFetcher = Mock(DefaultColumnNameFetcher) def fetcher = new ColumnNameForPropertyAndPathFetcher( namingStrategy, - hibernateEntityWrapper, propToConfig, defaultColumnFetcher, backticksRemover @@ -46,12 +44,10 @@ class ColumnNameForPropertyAndPathFetcherSpec extends Specification { def "when ColumnConfig provided and join key mapping exists then join key name is used"() { given: def namingStrategy = Mock(PersistentEntityNamingStrategy) - def hibernateEntityWrapper = Mock(HibernateEntityWrapper) def propToConfig = Mock(PersistentPropertyToPropertyConfig) def defaultColumnFetcher = Mock(DefaultColumnNameFetcher) def fetcher = new ColumnNameForPropertyAndPathFetcher( namingStrategy, - hibernateEntityWrapper, propToConfig, defaultColumnFetcher, backticksRemover @@ -80,12 +76,10 @@ class ColumnNameForPropertyAndPathFetcherSpec extends Specification { def "when no explicit column then builds from path '#path' and default column '#defaultCol' with backticks removed"() { given: def namingStrategy = Mock(PersistentEntityNamingStrategy) - def hibernateEntityWrapper = Mock(HibernateEntityWrapper) def propToConfig = Mock(PersistentPropertyToPropertyConfig) def defaultColumnFetcher = Mock(DefaultColumnNameFetcher) def fetcher = new ColumnNameForPropertyAndPathFetcher( namingStrategy, - hibernateEntityWrapper, propToConfig, defaultColumnFetcher, backticksRemover @@ -114,12 +108,10 @@ class ColumnNameForPropertyAndPathFetcherSpec extends Specification { def "when path is empty falls back to default column name only"() { given: def namingStrategy = Mock(PersistentEntityNamingStrategy) - def hibernateEntityWrapper = Mock(HibernateEntityWrapper) def propToConfig = Mock(PersistentPropertyToPropertyConfig) def defaultColumnFetcher = Mock(DefaultColumnNameFetcher) def fetcher = new ColumnNameForPropertyAndPathFetcher( namingStrategy, - hibernateEntityWrapper, propToConfig, defaultColumnFetcher, backticksRemover diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapperSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapperSpec.groovy deleted file mode 100644 index 7395b13472..0000000000 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapperSpec.groovy +++ /dev/null @@ -1,158 +0,0 @@ -package org.grails.orm.hibernate.cfg.domainbinding - -import org.grails.datastore.mapping.model.ClassMapping -import org.grails.datastore.mapping.model.MappingContext -import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.mapping.model.types.Association -import org.grails.datastore.mapping.model.types.Embedded -import org.grails.datastore.mapping.model.types.TenantId -import org.grails.datastore.mapping.reflect.EntityReflector -import org.grails.orm.hibernate.cfg.HibernateMappingContext -import org.grails.orm.hibernate.cfg.HibernatePersistentEntity -import org.grails.orm.hibernate.cfg.Mapping -import org.hibernate.MappingException -import spock.lang.Specification - -class HibernateEntityWrapperSpec extends Specification { - - def "Test getMappedForm with different PersistentEntity types"() { - given: - def wrapper = new HibernateEntityWrapper() - - and: "a mock HibernatePersistentEntity" - def hibernateEntity = Mock(HibernatePersistentEntity) - def hibernateMapping = Mock(Mapping) - hibernateEntity.getMappedForm() >> hibernateMapping - - and: "a mock HibernateEmbeddedPersistentEntity" - def embeddedEntity = Mock(HibernateMappingContext.HibernateEmbeddedPersistentEntity) - def embeddedMapping = Mock(Mapping) - embeddedEntity.getMappedForm() >> embeddedMapping - - and: "a generic PersistentEntity implementation" - def genericEntity = new TestPersistentEntity() - - when: "getMappedForm is called with a HibernatePersistentEntity" - def resultForHibernateEntity = wrapper.getMappedForm(hibernateEntity) - - then: "it returns the correct mapping" - resultForHibernateEntity == hibernateMapping - - when: "getMappedForm is called with a HibernateEmbeddedPersistentEntity" - def resultForEmbeddedEntity = wrapper.getMappedForm(embeddedEntity) - - then: "it returns the correct mapping" - resultForEmbeddedEntity == embeddedMapping - - when: "getMappedForm is called with a generic PersistentEntity" - wrapper.getMappedForm(genericEntity) - - then: "a MappingException is thrown" - thrown(MappingException) - } - - // Helper class for the exception test - private static class TestPersistentEntity implements PersistentEntity { - @Override - String getName() { - return "TestEntity" - } - - // Other methods can return null or default values as they are not called - @Override - Class getJavaClass() { return null } - @Override - boolean isInstance(Object obj) { return false } - @Override - String getDecapitalizedName() { return null } - @Override - List<String> getPersistentPropertyNames() { return [] } - @Override - List<PersistentProperty> getPersistentProperties() { return [] } - @Override - List<Association> getAssociations() { return [] } - - @Override - List<Embedded> getEmbedded() { - return null - } - - @Override - PersistentProperty getPropertyByName(String name) { return null } - @Override - PersistentProperty getIdentity() { return null } - @Override - PersistentProperty getVersion() { return null } - @Override - boolean isVersioned() { return false } - - - @Override - TenantId getTenantId() { - return null - } - - - @Override - PersistentEntity getParentEntity() { return null } - @Override - PersistentEntity getRootEntity() { return null } - @Override - boolean isRoot() { return false } - @Override - String getDiscriminator() { return null } - @Override - boolean isOwningEntity(PersistentEntity owner) { return false } - @Override - Object newInstance() { return null } - @Override - void initialize() { } - - @Override - boolean isInitialized() { - return false - } - - @Override - MappingContext getMappingContext() { return null } - - @Override - boolean hasProperty(String name, Class type) { - return false - } - - @Override - boolean isIdentityName(String propertyName) { - return false - } - - @Override - EntityReflector getReflector() { - return null - } - - @Override - boolean addOwner(Class type) { - return false - } - - @Override - boolean isExternal() { return false } - - @Override - boolean isMultiTenant() { - return false - } - - @Override - PersistentProperty[] getCompositeIdentity() { - return null - } - - @Override - void setExternal(boolean external) { } - @Override - ClassMapping getMapping() { return null } - } -} 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 c256f1ed44..9e99245353 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 @@ -27,19 +27,19 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def manyToOneValuesBinder = Mock(ManyToOneValuesBinder) def compositeBinder = Mock(CompositeIdentifierToManyToOneBinder) def columnFetcher = Mock(SimpleValueColumnFetcher) - def entityWrapper = Mock(HibernateEntityWrapper) - def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher, entityWrapper) + def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher) def association = Mock(Association) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) def path = "/test" - def refDomainClass = Mock(PersistentEntity) def mapping = new Mapping() + def refDomainClass = Mock(PersistentEntity) { + getMappedForm() >> mapping + } def propertyConfig = new PropertyConfig() association.getAssociatedEntity() >> refDomainClass - entityWrapper.getMappedForm(refDomainClass) >> mapping propertyConfigConverter.toPropertyConfig(association) >> propertyConfig mapping.setIdentity(hasCompositeId ? new CompositeIdentity() : null) @@ -65,21 +65,21 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def manyToOneValuesBinder = Mock(ManyToOneValuesBinder) def compositeBinder = Mock(CompositeIdentifierToManyToOneBinder) def columnFetcher = Mock(SimpleValueColumnFetcher) - def entityWrapper = Mock(HibernateEntityWrapper) - def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher, entityWrapper) + def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher) def property = Mock(ManyToMany) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) - def ownerEntity = Mock(PersistentEntity) def mapping = new Mapping() mapping.setColumns(new HashMap<String, PropertyConfig>()) + def ownerEntity = Mock(PersistentEntity) { + getMappedForm() >> mapping + } def propertyConfig = new PropertyConfig() property.isCircular() >> true property.getOwner() >> ownerEntity property.getName() >> "myCircularProp" - entityWrapper.getMappedForm(ownerEntity) >> mapping propertyConfigConverter.toPropertyConfig(property) >> propertyConfig namingStrategy.resolveColumnName("myCircularProp") >> "my_circular_prop" @@ -103,20 +103,20 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def manyToOneValuesBinder = Mock(ManyToOneValuesBinder) def compositeBinder = Mock(CompositeIdentifierToManyToOneBinder) def columnFetcher = Mock(SimpleValueColumnFetcher) - def entityWrapper = Mock(HibernateEntityWrapper) - def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher, entityWrapper) + def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher) def property = Mock(OneToOne) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) - def refDomainClass = Mock(PersistentEntity) def mapping = new Mapping() + def refDomainClass = Mock(PersistentEntity) { + getMappedForm() >> mapping + } def propertyConfig = Mock(PropertyConfig) def column = new Column('test') def inverseSide = Mock(Association) property.getAssociatedEntity() >> refDomainClass - entityWrapper.getMappedForm(refDomainClass) >> mapping mapping.setIdentity(null) propertyConfigConverter.toPropertyConfig(property) >> propertyConfig columnFetcher.getColumnForSimpleValue(manyToOne) >> column @@ -155,18 +155,18 @@ class ManyToOneBinderSpec extends HibernateGormDatastoreSpec { def manyToOneValuesBinder = Mock(ManyToOneValuesBinder) def compositeBinder = Mock(CompositeIdentifierToManyToOneBinder) def columnFetcher = Mock(SimpleValueColumnFetcher) - def entityWrapper = Mock(HibernateEntityWrapper) - def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher, entityWrapper) + def binder = new ManyToOneBinder(namingStrategy, simpleValueBinder, propertyConfigConverter, manyToOneValuesBinder, compositeBinder, columnFetcher) def property = Mock(OneToOne) def manyToOne = new ManyToOne(getGrailsDomainBinder().getMetadataBuildingContext(), null) - def refDomainClass = Mock(PersistentEntity) def mapping = new Mapping() + def refDomainClass = Mock(PersistentEntity) { + getMappedForm() >> mapping + } def propertyConfig = new PropertyConfig() property.getAssociatedEntity() >> refDomainClass - entityWrapper.getMappedForm(refDomainClass) >> mapping mapping.setIdentity(null) propertyConfigConverter.toPropertyConfig(property) >> propertyConfig columnFetcher.getColumnForSimpleValue(manyToOne) >> null diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy index 4aa66fc48b..970fbe3a7f 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleIdBinderSpec.groovy @@ -16,7 +16,6 @@ class SimpleIdBinderSpec extends HibernateGormDatastoreSpec { MetadataBuildingContext metadataBuildingContext JdbcEnvironment jdbcEnvironment - def hibernateEntityWrapper def simpleValueBinder def propertyBinder def basicValueIdcreator @@ -34,27 +33,27 @@ class SimpleIdBinderSpec extends HibernateGormDatastoreSpec { } // Mock the collaborators that can be safely mocked - hibernateEntityWrapper = Mock(HibernateEntityWrapper) simpleValueBinder = Mock(SimpleValueBinder) propertyBinder = Mock(PropertyBinder) - simpleIdBinder = new SimpleIdBinder(basicValueIdcreator, hibernateEntityWrapper, simpleValueBinder, propertyBinder) + simpleIdBinder = new SimpleIdBinder(basicValueIdcreator, simpleValueBinder, propertyBinder) } def "bindSimpleId with identity generator"() { given: + def mapping = Mock(org.grails.orm.hibernate.cfg.Mapping) { + isTablePerConcreteClass() >> false + } def testProperty = Mock(PersistentProperty) { getName() >> "id" - getOwner() >> Mock(PersistentEntity) + getOwner() >> Mock(PersistentEntity) { + getMappedForm() >> mapping + } } def rootClass = new RootClass(metadataBuildingContext) def table = new Table("TEST_TABLE") rootClass.setTable(table) - hibernateEntityWrapper.getMappedForm(_) >> Mock(org.grails.orm.hibernate.cfg.Mapping) { - isTablePerConcreteClass() >> false - } - when: simpleIdBinder.bindSimpleId(testProperty, rootClass, new Identity(generator: 'identity')) @@ -70,18 +69,19 @@ class SimpleIdBinderSpec extends HibernateGormDatastoreSpec { def "bindSimpleId with sequence generator"() { given: + def mapping = Mock(org.grails.orm.hibernate.cfg.Mapping) { + isTablePerConcreteClass() >> true + } def testProperty = Mock(PersistentProperty) { getName() >> "id" - getOwner() >> Mock(PersistentEntity) + getOwner() >> Mock(PersistentEntity) { + getMappedForm() >> mapping + } } def rootClass = new RootClass(metadataBuildingContext) def table = new Table("TEST_TABLE") rootClass.setTable(table) - hibernateEntityWrapper.getMappedForm(_) >> Mock(org.grails.orm.hibernate.cfg.Mapping) { - isTablePerConcreteClass() >> true - } - when: simpleIdBinder.bindSimpleId(testProperty, rootClass, new Identity(generator: 'sequence', params: [sequence: 'SEQ_TEST'])) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy index e1596e98ca..b2f4414ed0 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/SimpleValueBinderSpec.groovy @@ -18,13 +18,11 @@ class SimpleValueBinderSpec extends Specification { def columnConfigToColumnBinder = Mock(ColumnConfigToColumnBinder) def columnBinder = Mock(ColumnBinder) def persistentPropertyToPropertyConfig = Mock(PersistentPropertyToPropertyConfig) - def hibernateEntityWrapper = Mock(HibernateEntityWrapper) def typeNameProvider = Mock(TypeNameProvider) def binder = new SimpleValueBinder(columnConfigToColumnBinder, columnBinder, persistentPropertyToPropertyConfig, - hibernateEntityWrapper, typeNameProvider) def "sets type from provider when present and applies type params"() { @@ -40,7 +38,7 @@ class SimpleValueBinderSpec extends Specification { // stubs persistentPropertyToPropertyConfig.toPropertyConfig(prop) >> pc prop.getOwner() >> owner - hibernateEntityWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping typeNameProvider.getTypeName(prop, mapping) >> "custom.Type" pc.getTypeParams() >> props pc.isDerived() >> false @@ -75,7 +73,7 @@ class SimpleValueBinderSpec extends Specification { persistentPropertyToPropertyConfig.toPropertyConfig(prop) >> pc prop.getOwner() >> owner - hibernateEntityWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping typeNameProvider.getTypeName(prop, mapping) >> null pc.isDerived() >> false pc.getColumns() >> null @@ -108,7 +106,7 @@ class SimpleValueBinderSpec extends Specification { persistentPropertyToPropertyConfig.toPropertyConfig(tenantProp) >> tenantPc prop.getOwner() >> owner tenantProp.getOwner() >> owner - hibernateEntityWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping typeNameProvider.getTypeName(_, _) >> 'X' pc.isDerived() >> true @@ -146,7 +144,7 @@ class SimpleValueBinderSpec extends Specification { persistentPropertyToPropertyConfig.toPropertyConfig(prop) >> pc prop.getOwner() >> owner - hibernateEntityWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping typeNameProvider.getTypeName(prop, mapping) >> 'Y' pc.isDerived() >> false pc.getColumns() >> null @@ -177,7 +175,7 @@ class SimpleValueBinderSpec extends Specification { persistentPropertyToPropertyConfig.toPropertyConfig(prop) >> pc prop.getOwner() >> owner - hibernateEntityWrapper.getMappedForm(owner) >> mapping + owner.getMappedForm() >> mapping typeNameProvider.getTypeName(prop, mapping) >> 'Z' pc.isDerived() >> false pc.getColumns() >> [cc1, cc2] diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy index 2b1901b2ab..8f6c44bfe2 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/TableNameFetcherSpec.groovy @@ -12,13 +12,12 @@ class TableNameFetcherSpec extends Specification { def "Test getTableName when mapped form returns '#tableName'"() { given: def namingStrategy = Mock(PersistentEntityNamingStrategy) - def hibernateEntityWrapper = Mock(HibernateEntityWrapper) - def fetcher = new TableNameFetcher(namingStrategy, hibernateEntityWrapper) - def persistentEntity = Mock(PersistentEntity) + def fetcher = new TableNameFetcher(namingStrategy) def mapping = Mock(Mapping) + def persistentEntity = Mock(PersistentEntity) { + getMappedForm() >> mapping + } - // Setup: getMappedForm always returns a valid Mapping object, per its contract - hibernateEntityWrapper.getMappedForm(persistentEntity) >> mapping // The table name from the mapping can be explicit or null mapping.getTableName() >> tableName // The naming strategy will provide a fallback diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java index fe8562dbb5..2fa5b53aae 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java @@ -452,4 +452,6 @@ public abstract class AbstractPersistentEntity<T extends Entity> implements Pers return owners.add(type); } + + } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/EmbeddedPersistentEntity.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/EmbeddedPersistentEntity.java index 14e09157a5..c65680f0a4 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/EmbeddedPersistentEntity.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/EmbeddedPersistentEntity.java @@ -18,6 +18,7 @@ */ package org.grails.datastore.mapping.model; +import org.grails.datastore.mapping.config.Entity; import org.grails.datastore.mapping.reflect.FieldEntityAccess; /** @@ -27,7 +28,7 @@ import org.grails.datastore.mapping.reflect.FieldEntityAccess; * @since 1.0 */ @SuppressWarnings({"rawtypes", "unchecked"}) -public class EmbeddedPersistentEntity extends AbstractPersistentEntity { +public class EmbeddedPersistentEntity<T extends Entity> extends AbstractPersistentEntity<T> { public EmbeddedPersistentEntity(Class type, MappingContext ctx) { super(type, ctx); } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/PersistentEntity.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/PersistentEntity.java index 9dddfdf909..10012c5cc7 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/PersistentEntity.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/PersistentEntity.java @@ -144,6 +144,14 @@ public interface PersistentEntity extends Initializable { */ ClassMapping getMapping(); + /** + * @return The mapped form of the entity + */ + default org.grails.datastore.mapping.config.Entity getMappedForm() { + ClassMapping mapping = getMapping(); + return mapping != null ? mapping.getMappedForm() : null; + } + /** * Constructs a new instance * @return The new instnace @@ -228,4 +236,5 @@ public interface PersistentEntity extends Initializable { boolean addOwner(Class type); + }
