This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch merge-hibernate6 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 1a68f1bbf6873e1b7d7da7041e073921cfd7e1aa Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Jul 21 22:01:00 2025 -0500 HibernateEntityWrapper --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 93 +++++++++++----------- .../orm/hibernate/cfg/HibernateMappingContext.java | 11 ++- .../cfg/domainbinding/EnumTypeBinder.java | 5 +- .../cfg/domainbinding/HibernateEntityWrapper.java | 39 +++++++++ 4 files changed, 97 insertions(+), 51 deletions(-) diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index 8c4401fa7b..e7f619e3e6 100644 --- a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -300,8 +300,7 @@ public class GrailsDomainBinder implements MetadataContributor { SimpleValue elt = new BasicValue(metadataBuildingContext, map.getCollectionTable()); map.setElement(elt); - HibernatePersistentEntity owner = (HibernatePersistentEntity) property.getOwner(); - Mapping mapping =owner.getMappedForm(); + Mapping mapping = new HibernateEntityWrapper(property.getOwner()).getMappedForm(); String typeName = new TypeNameProvider().getTypeName(property, mapping); if (typeName == null ) { @@ -332,6 +331,14 @@ public class GrailsDomainBinder implements MetadataContributor { return null; } + /** + * @TODO NOT TESTED + * @param property + * @param mappings + * @param persistentClasses + * @param list + * @param sessionFactoryBeanName + */ private void bindListSecondPass(ToMany property, InFlightMetadataCollector mappings, Map<?, ?> persistentClasses, org.hibernate.mapping.List list, String sessionFactoryBeanName) { @@ -755,7 +762,7 @@ public class GrailsDomainBinder implements MetadataContributor { } else { - Mapping mapping = getMapping(property.getOwner()); + Mapping mapping = new HibernateEntityWrapper(property.getOwner()).getMappedForm();; String typeName = new TypeNameProvider().getTypeName(property, mapping); if (typeName == null) { Type type = mappings.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType(className); @@ -779,7 +786,7 @@ public class GrailsDomainBinder implements MetadataContributor { } else { final PersistentEntity domainClass = property.getAssociatedEntity(); - Mapping m = getMapping(domainClass); + Mapping m = new HibernateEntityWrapper(domainClass).getMappedForm(); if (hasCompositeIdentifier(m)) { CompositeIdentity ci = (CompositeIdentity) m.getIdentity(); bindCompositeIdentifierToManyToOne(property, element, ci, domainClass, @@ -863,7 +870,7 @@ public class GrailsDomainBinder implements MetadataContributor { } PersistentEntity refDomainClass = property.getOwner(); - final Mapping mapping = getMapping(refDomainClass.getJavaClass()); + final Mapping mapping = new HibernateEntityWrapper(refDomainClass).getMappedForm(); boolean hasCompositeIdentifier = hasCompositeIdentifier(mapping); if ((shouldCollectionBindWithJoinColumn((ToMany) property) && hasCompositeIdentifier) || (hasCompositeIdentifier && ( property instanceof ManyToMany))) { @@ -1198,7 +1205,7 @@ public class GrailsDomainBinder implements MetadataContributor { * @return The table name */ private String getTableName(PersistentEntity domainClass, String sessionFactoryBeanName) { - Mapping m = getMapping(domainClass); + Mapping m = new HibernateEntityWrapper(domainClass).getMappedForm(); String tableName = null; if (m != null && m.getTableName() != null) { tableName = m.getTableName(); @@ -1242,7 +1249,7 @@ public class GrailsDomainBinder implements MetadataContributor { public void evaluateMapping(PersistentEntity domainClass) { try { - final Mapping m = (Mapping) domainClass.getMapping().getMappedForm(); + final Mapping m = new HibernateEntityWrapper(domainClass).getMappedForm(); trackCustomCascadingSaves(m, domainClass.getPersistentProperties()); AbstractGrailsDomainBinder.cacheMapping(domainClass.getJavaClass(), m); } catch (Exception e) { @@ -1295,15 +1302,6 @@ public class GrailsDomainBinder implements MetadataContributor { return Optional.ofNullable(AbstractGrailsDomainBinder.getMapping(theClass)).orElseThrow(); } - /** - * Obtains a mapping object for the given domain class nam - * - * @param domainClass The domain class in question - * @return A Mapping object or null - */ - private static Mapping getMapping(PersistentEntity domainClass) { - return getMapping(domainClass.getJavaClass()); - } public static void clearMappingCache() { AbstractGrailsDomainBinder.clearMappingCache(); @@ -1341,14 +1339,15 @@ public class GrailsDomainBinder implements MetadataContributor { root.setPolymorphic(false); } else { root.setPolymorphic(true); - Mapping m =entity.getMappedForm(); + Mapping m = new HibernateEntityWrapper(entity).getMappedForm(); boolean tablePerSubclass = m != null && !m.getTablePerHierarchy(); if (!tablePerSubclass) { // if the root class has children create a discriminator property - bindDiscriminatorProperty(root.getTable(), root, mappings); + + bindDiscriminatorProperty(root.getTable(), root, m); } // bind the sub classes - bindSubClasses(entity, root, mappings, sessionFactoryBeanName); + bindSubClasses(entity, root, mappings, sessionFactoryBeanName, m); } addMultiTenantFilterIfNecessary(entity, root, mappings, sessionFactoryBeanName); @@ -1400,13 +1399,14 @@ public class GrailsDomainBinder implements MetadataContributor { /** * Binds the sub classes of a root class using table-per-heirarchy inheritance mapping * - * @param domainClass The root domain class to bind - * @param parent The parent class instance - * @param mappings The mappings instance - * @param sessionFactoryBeanName the session factory bean name + * @param domainClass The root domain class to bind + * @param parent The parent class instance + * @param mappings The mappings instance + * @param sessionFactoryBeanName the session factory bean name + * @param m */ private void bindSubClasses(HibernatePersistentEntity domainClass, PersistentClass parent, - InFlightMetadataCollector mappings, String sessionFactoryBeanName) { + InFlightMetadataCollector mappings, String sessionFactoryBeanName, Mapping m) { domainClass.getMappingContext() .getDirectChildEntities(domainClass) .stream() @@ -1414,7 +1414,7 @@ public class GrailsDomainBinder implements MetadataContributor { .map(HibernatePersistentEntity.class::cast) .filter(this::usesConnectionSource) .filter(sub -> isChildEntity(sub, domainClass)) - .forEach( sub -> bindSubClass(sub, parent, mappings, sessionFactoryBeanName)); + .forEach( sub -> bindSubClass(sub, parent, mappings, sessionFactoryBeanName, m)); } @@ -1431,9 +1431,8 @@ public class GrailsDomainBinder implements MetadataContributor { * @param sessionFactoryBeanName the session factory bean name */ private void bindSubClass(HibernatePersistentEntity sub, PersistentClass parent, - InFlightMetadataCollector mappings, String sessionFactoryBeanName) { + InFlightMetadataCollector mappings, String sessionFactoryBeanName,Mapping m) { evaluateMapping(sub); - Mapping m = getMapping(parent.getMappedClass()); Subclass subClass; boolean tablePerSubclass = m != null && !m.getTablePerHierarchy() && !m.isTablePerConcreteClass(); boolean tablePerConcreteClass = m != null && m.isTablePerConcreteClass(); @@ -1449,7 +1448,7 @@ public class GrailsDomainBinder implements MetadataContributor { // 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 = getMapping(sub); + Mapping subMapping = new HibernateEntityWrapper(sub).getMappedForm(); DiscriminatorConfig discriminatorConfig = subMapping != null ? subMapping.getDiscriminator() : null; subClass.setDiscriminatorValue(discriminatorConfig != null && discriminatorConfig.getValue() != null ? discriminatorConfig.getValue() : fullName); @@ -1492,7 +1491,7 @@ public class GrailsDomainBinder implements MetadataContributor { final java.util.Collection<PersistentEntity> childEntities = sub.getMappingContext().getDirectChildEntities(sub); if (!childEntities.isEmpty()) { // bind the sub classes - bindSubClasses(sub, subClass, mappings, sessionFactoryBeanName); + bindSubClasses(sub, subClass, mappings, sessionFactoryBeanName, m); } } @@ -1501,7 +1500,7 @@ public class GrailsDomainBinder implements MetadataContributor { InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { classBinding.bindClass(subClass, unionSubclass, mappings); - Mapping subMapping = getMapping(subClass.getJavaClass()); + Mapping subMapping = new HibernateEntityWrapper(subClass).getMappedForm(); if ( unionSubclass.getEntityPersisterClass() == null ) { unionSubclass.getRootClass().setEntityPersisterClass( @@ -1609,15 +1608,14 @@ public class GrailsDomainBinder implements MetadataContributor { * Creates and binds the discriminator property used in table-per-hierarchy inheritance to * discriminate between sub class instances * - * @param table The table to bind onto - * @param entity The root class entity - * @param mappings The mappings instance + * @param table The table to bind onto + * @param entity The root class entity + * @param someMapping The mappings instance */ - private void bindDiscriminatorProperty(Table table, RootClass entity, InFlightMetadataCollector mappings) { - Mapping m = getMapping(entity.getMappedClass()); + private void bindDiscriminatorProperty(Table table, RootClass entity, Mapping someMapping) { SimpleValue d = new BasicValue(metadataBuildingContext, table); entity.setDiscriminator(d); - DiscriminatorConfig discriminatorConfig = m != null ? m.getDiscriminator() : null; + DiscriminatorConfig discriminatorConfig = someMapping != null ? someMapping.getDiscriminator() : null; boolean hasDiscriminatorConfig = discriminatorConfig != null; entity.setDiscriminatorValue(hasDiscriminatorConfig ? discriminatorConfig.getValue() : entity.getClassName()); @@ -1670,7 +1668,7 @@ public class GrailsDomainBinder implements MetadataContributor { RootClass root, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { // get the schema and catalog names from the configuration - Mapping m = domainClass.getMappedForm(); + Mapping m = new HibernateEntityWrapper(domainClass).getMappedForm(); configureDerivedProperties(domainClass, m); CacheConfig cc = m.getCache(); @@ -1793,7 +1791,7 @@ public class GrailsDomainBinder implements MetadataContributor { final List<PersistentProperty> persistentProperties = domainClass.getPersistentProperties(); Table table = persistentClass.getTable(); - Mapping gormMapping = domainClass.getMappedForm(); + Mapping gormMapping = new HibernateEntityWrapper(domainClass).getMappedForm(); if (gormMapping != null) { table.setComment(gormMapping.getComment()); @@ -2131,7 +2129,7 @@ public class GrailsDomainBinder implements MetadataContributor { private boolean isComponentPropertyNullable(PersistentProperty componentProperty) { if (componentProperty == null) return false; final HibernatePersistentEntity domainClass = (HibernatePersistentEntity) componentProperty.getOwner(); - final Mapping mapping = domainClass.getMappedForm(); + final Mapping mapping = new HibernateEntityWrapper(domainClass).getMappedForm(); return !domainClass.isRoot() && (mapping == null || mapping.isTablePerHierarchy()) || componentProperty.isNullable(); } @@ -2166,7 +2164,7 @@ public class GrailsDomainBinder implements MetadataContributor { String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { bindManyToOneValues(property, manyToOne); PersistentEntity refDomainClass = property instanceof ManyToMany ? property.getOwner() : property.getAssociatedEntity(); - Mapping mapping = ((HibernatePersistentEntity)refDomainClass).getMappedForm(); + Mapping mapping = new HibernateEntityWrapper(refDomainClass).getMappedForm(); boolean isComposite = hasCompositeIdentifier(mapping); if (isComposite) { CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity(); @@ -2391,7 +2389,7 @@ public class GrailsDomainBinder implements MetadataContributor { private void bindSimpleId(PersistentProperty identifier, RootClass entity, InFlightMetadataCollector mappings, Identity mappedId, String sessionFactoryBeanName) { - Mapping mapping = ((HibernatePersistentEntity)identifier.getOwner()).getMappedForm(); + Mapping mapping = new HibernateEntityWrapper(identifier.getOwner()).getMappedForm(); boolean useSequence = mapping != null && mapping.isTablePerConcreteClass(); // create the id value @@ -2595,7 +2593,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (referenced != null && referenced.isOwningEntity(domainClass) && !isCircularAssociation(grailsProperty)) { cascadeStrategy = CASCADE_ALL; } - else if(isCompositeIdProperty(getMapping(domainClass), grailsProperty)) { + else if(isCompositeIdProperty(new HibernateEntityWrapper(domainClass).getMappedForm(), grailsProperty)) { cascadeStrategy = CASCADE_ALL; } else { @@ -2724,7 +2722,7 @@ public class GrailsDomainBinder implements MetadataContributor { } private void setTypeForPropertyConfig(PersistentProperty grailsProp, SimpleValue simpleValue, PropertyConfig config) { - Mapping mapping = getMapping(grailsProp.getOwner()); + Mapping mapping = new HibernateEntityWrapper(grailsProp.getOwner()).getMappedForm(); final String typeName = new TypeNameProvider().getTypeName(grailsProp, mapping); if (typeName == null) { simpleValue.setTypeName(grailsProp.getType().getName()); @@ -2805,7 +2803,7 @@ public class GrailsDomainBinder implements MetadataContributor { final PersistentEntity owner = property.getOwner(); if (!owner.isRoot()) { - Mapping mapping = getMapping(owner); + Mapping mapping = new HibernateEntityWrapper(owner).getMappedForm(); if (mapping == null || mapping.getTablePerHierarchy()) { if (LOG.isDebugEnabled()) LOG.debug("[GrailsDomainBinder] Sub class property [" + property.getName() + "] for column name ["+column.getName()+"] set to nullable"); @@ -2859,7 +2857,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (cc == null) { // No column config given, so try to fetch it from the mapping PersistentEntity domainClass = grailsProp.getOwner(); - Mapping m = getMapping(domainClass); + Mapping m = new HibernateEntityWrapper(domainClass).getMappedForm(); if (m != null) { PropertyConfig c = m.getPropertyConfig(grailsProp.getName()); @@ -2956,7 +2954,7 @@ public class GrailsDomainBinder implements MetadataContributor { private String getIndexColumnType(PersistentProperty property, String defaultType) { PropertyConfig pc = new PersistentPropertyToPropertyConfig().apply(property); if (pc != null && pc.getIndexColumn() != null && pc.getIndexColumn().getType() != null) { - Mapping mapping = ((HibernatePersistentEntity)property.getOwner()).getMappedForm(); + Mapping mapping =new HibernateEntityWrapper(property.getOwner()).getMappedForm(); return new TypeNameProvider().getTypeName(property, mapping); } return defaultType; @@ -3069,6 +3067,7 @@ public class GrailsDomainBinder implements MetadataContributor { } } + class ListSecondPass extends GrailsCollectionSecondPass { private static final long serialVersionUID = -3024674993774205193L; @@ -3212,7 +3211,7 @@ public class GrailsDomainBinder implements MetadataContributor { } public String getTypeName(ToMany property) { - Mapping mapping = getMapping(property.getOwner()); + Mapping mapping = new HibernateEntityWrapper(property.getOwner()).getMappedForm(); return new TypeNameProvider().getTypeName(property, mapping); } diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java index c0d537eae3..99da87af2a 100644 --- a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java @@ -199,8 +199,13 @@ public class HibernateMappingContext extends AbstractMappingContext { .toList(); } - static class HibernateEmbeddedPersistentEntity extends EmbeddedPersistentEntity { + 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>() { @@ -219,7 +224,11 @@ public class HibernateMappingContext extends AbstractMappingContext { public IdentityMapping getIdentifier() { return null; } + + }; + + } @Override diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java index a076c1fda2..0da72db063 100644 --- a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/EnumTypeBinder.java @@ -41,8 +41,7 @@ public class EnumTypeBinder { public void bindEnumType(PersistentProperty property, Class<?> propertyType, SimpleValue simpleValue, String columnName) { PropertyConfig pc = new PersistentPropertyToPropertyConfig().apply(property); - final HibernatePersistentEntity owner = (HibernatePersistentEntity) property.getOwner(); - Mapping ownerMapping = owner.getMappedForm(); + Mapping ownerMapping = new HibernateEntityWrapper(property.getOwner()).getMappedForm(); String enumType = pc.getEnumType(); Properties enumProperties = new Properties(); enumProperties.put(ENUM_CLASS_PROP, propertyType.getName()); @@ -68,7 +67,7 @@ public class EnumTypeBinder { simpleValue.setTypeParameters(enumProperties); Column column = new Column(); - boolean isTablePerHierarchySubclass = !owner.isRoot() && (ownerMapping == null || ownerMapping.getTablePerHierarchy()); + boolean isTablePerHierarchySubclass = !property.getOwner().isRoot() && (ownerMapping == null || ownerMapping.getTablePerHierarchy()); if (isTablePerHierarchySubclass) { // Properties on subclasses in a table-per-hierarchy strategy must be nullable. if (LOG.isDebugEnabled()) { diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapper.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapper.java new file mode 100644 index 0000000000..fb817ed5ab --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/HibernateEntityWrapper.java @@ -0,0 +1,39 @@ +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; + +public class HibernateEntityWrapper { + + private HibernatePersistentEntity hibernatePersistentEntity; + private HibernateMappingContext.HibernateEmbeddedPersistentEntity hibernateEmbeddedPersistentEntity; + + public HibernateEntityWrapper(PersistentEntity hibernatePersistentEntity) { + if (hibernatePersistentEntity instanceof HibernatePersistentEntity) { + this.hibernatePersistentEntity = (HibernatePersistentEntity) hibernatePersistentEntity; + } else if (hibernatePersistentEntity instanceof HibernateMappingContext.HibernateEmbeddedPersistentEntity) { + this.hibernateEmbeddedPersistentEntity = (HibernateMappingContext.HibernateEmbeddedPersistentEntity) hibernatePersistentEntity; + } else { + throw new MappingException("Not correct Persistent Entity "+ hibernatePersistentEntity.getClass()); + } + } + + + public Mapping getMappedForm() { + if (hibernatePersistentEntity != null) { + return hibernatePersistentEntity.getMappedForm(); + } else if (hibernateEmbeddedPersistentEntity != null) { + return hibernateEmbeddedPersistentEntity.getMappedForm(); + } else { + return null; + } + } + + +}
