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 c87c45a1818f333a503dbe19342ab7ebf822f777 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Mon Jul 21 18:36:03 2025 -0500 NamingStrategyWrapper --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 63 +++++++++------------- .../cfg/domainbinding/NamingStrategyWrapper.java | 25 +++++++++ .../datastore/mapping/model/types/Basic.java | 15 ++++-- 3 files changed, 59 insertions(+), 44 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 4e518b894f..8c4401fa7b 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 @@ -165,6 +165,7 @@ public class GrailsDomainBinder implements MetadataContributor { private Closure defaultMapping; private PersistentEntityNamingStrategy namingStrategy; private MetadataBuildingContext metadataBuildingContext; + private NamingStrategyWrapper namingStrategyWrapper; public JdbcEnvironment getJdbcEnvironment() { @@ -719,7 +720,7 @@ public class GrailsDomainBinder implements MetadataContributor { private void bindCollectionWithJoinTable(ToMany property, InFlightMetadataCollector mappings, Collection collection, PropertyConfig config, String sessionFactoryBeanName) { - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); +// PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); SimpleValue element; final boolean isBasicCollectionType = property instanceof Basic; @@ -744,9 +745,9 @@ public class GrailsDomainBinder implements MetadataContributor { columnName = joinColumnMappingOptional.get().getName(); } else { - var clazz = namingStrategy.toPhysicalColumnName(toIdentifier(className),getJdbcEnvironment()); - var prop = namingStrategy.toPhysicalTableName(toIdentifier(property.getName()),getJdbcEnvironment()); - columnName = isEnum ? clazz.toString() : addUnderscore(prop.toString(), clazz.toString()); + var clazz = namingStrategyWrapper.getColumnName(className); + var prop = namingStrategyWrapper.getTableName(property.getName()); + columnName = isEnum ? clazz : addUnderscore(prop, clazz); } if (isEnum) { @@ -789,8 +790,8 @@ public class GrailsDomainBinder implements MetadataContributor { columnName = joinColumnMappingOptional.get().getName(); } else { - Identifier decapitalize = toIdentifier(NameUtils.decapitalize(domainClass.getName())); - columnName = namingStrategy.toPhysicalColumnName(decapitalize,getJdbcEnvironment()).toString() + FOREIGN_KEY_SUFFIX; + var decapitalize = domainClass.getName(); + columnName = namingStrategyWrapper.getColumnName(decapitalize) + FOREIGN_KEY_SUFFIX; } new SimpleValueBinder().bindSimpleValue(element, "long", columnName, true); @@ -1103,9 +1104,8 @@ public class GrailsDomainBinder implements MetadataContributor { PropertyConfig config = new PersistentPropertyToPropertyConfig().apply(property); JoinTable jt = config != null ? config.getJoinTable() : null; - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); String s = calculateTableForMany(property, sessionFactoryBeanName); - String tableName = (jt != null && jt.getName() != null ? jt.getName() : namingStrategy.toPhysicalTableName(toIdentifier(s),getJdbcEnvironment()).toString()); + String tableName = (jt != null && jt.getName() != null ? jt.getName() : namingStrategyWrapper.getTableName(s)); String schemaName = getSchemaName(mappings); String catalogName = getCatalogName(mappings); if(jt != null) { @@ -1132,9 +1132,7 @@ public class GrailsDomainBinder implements MetadataContributor { * where you have two mapping tables for left_right and right_left */ private String calculateTableForMany(ToMany property, String sessionFactoryBeanName) { - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - - String propertyColumnName = namingStrategy.toPhysicalColumnName(toIdentifier(property.getName()), getJdbcEnvironment()).toString(); + String propertyColumnName = namingStrategyWrapper.getColumnName(property.getName()); //fix for GRAILS-5895 PropertyConfig config = new PersistentPropertyToPropertyConfig().apply(property); JoinTable jt = config != null ? config.getJoinTable() : null; @@ -1168,8 +1166,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (property.isOwningSide()) { return addUnderscore(left, propertyColumnName); } - Identifier inversePropertyName = toIdentifier(property1.getInversePropertyName()); - return addUnderscore(right, namingStrategy.toPhysicalColumnName(inversePropertyName,getJdbcEnvironment()).toString()); + return addUnderscore(right, namingStrategyWrapper.getColumnName(property1.getInversePropertyName())); } if (shouldCollectionBindWithJoinColumn(property)) { @@ -1214,7 +1211,7 @@ public class GrailsDomainBinder implements MetadataContributor { tableName = namingStrategy.resolveTableName(domainClass); } if(tableName == null) { - tableName = getPhysicalNamingStrategy(sessionFactoryBeanName).toPhysicalTableName(toIdentifier(shortName),getJdbcEnvironment()).toString(); + tableName = namingStrategyWrapper.getTableName(shortName); } } return tableName; @@ -1325,6 +1322,9 @@ public class GrailsDomainBinder implements MetadataContributor { * @param sessionFactoryBeanName the session factory bean name */ protected void bindRoot(HibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { + this.namingStrategyWrapper = new NamingStrategyWrapper( + getPhysicalNamingStrategy(sessionFactoryBeanName) + ,getJdbcEnvironment()); if (mappings.getEntityBinding(entity.getName()) != null) { LOG.info("[GrailsDomainBinder] Class [" + entity.getName() + "] is already mapped, skipping.. "); return; @@ -2164,10 +2164,6 @@ public class GrailsDomainBinder implements MetadataContributor { @SuppressWarnings("unchecked") private void bindManyToOne(Association property, ManyToOne manyToOne, String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { - - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - - bindManyToOneValues(property, manyToOne); PersistentEntity refDomainClass = property instanceof ManyToMany ? property.getOwner() : property.getAssociatedEntity(); Mapping mapping = ((HibernatePersistentEntity)refDomainClass).getMappedForm(); @@ -2186,7 +2182,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (!hasJoinKeyMapping(pc) ) { JoinTable jt = new JoinTable(); final ColumnConfig columnConfig = new ColumnConfig(); - columnConfig.setName(namingStrategy.toPhysicalColumnName(toIdentifier(property.getName()), getJdbcEnvironment()).toString() + UNDERSCORE + FOREIGN_KEY_SUFFIX); + columnConfig.setName(namingStrategyWrapper.getColumnName(property.getName()) + UNDERSCORE + FOREIGN_KEY_SUFFIX); jt.setKey(columnConfig); pc.setJoinTable(jt); } @@ -2214,9 +2210,6 @@ public class GrailsDomainBinder implements MetadataContributor { private void bindCompositeIdentifierToManyToOne(Association property, SimpleValue value, CompositeIdentity compositeId, PersistentEntity refDomainClass, String path, String sessionFactoryBeanName) { - - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - String[] propertyNames = compositeId.getPropertyNames(); PropertyConfig config = new PersistentPropertyToPropertyConfig().apply(property); @@ -2249,7 +2242,8 @@ public class GrailsDomainBinder implements MetadataContributor { if(compositeIdentity != null) { for (PersistentProperty cip : compositeIdentity) { // for each property of a composite id by default we use the table name and the property name as a prefix - String compositeIdPrefix = addUnderscore(prefix, namingStrategy.toPhysicalColumnName(toIdentifier(referencedProperty.getName()), getJdbcEnvironment()).toString()); + String string = namingStrategyWrapper.getColumnName(referencedProperty.getName()); + String compositeIdPrefix = addUnderscore(prefix, string); String suffix = getDefaultColumnName(cip, sessionFactoryBeanName); String finalColumnName = addUnderscore(compositeIdPrefix, suffix); cc = new ColumnConfig(); @@ -2860,9 +2854,6 @@ public class GrailsDomainBinder implements MetadataContributor { private String getColumnNameForPropertyAndPath(PersistentProperty grailsProp, String path, ColumnConfig cc, String sessionFactoryBeanName) { - - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - // First try the column config. String columnName = null; if (cc == null) { @@ -2897,7 +2888,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (columnName == null) { if (isNotEmpty(path)) { - columnName = addUnderscore(namingStrategy.toPhysicalColumnName(toIdentifier(path), getJdbcEnvironment()).toString(), + columnName = addUnderscore(namingStrategyWrapper.getColumnName(path), getDefaultColumnName(grailsProp, sessionFactoryBeanName)); } else { columnName = getDefaultColumnName(grailsProp, sessionFactoryBeanName); @@ -2916,9 +2907,7 @@ public class GrailsDomainBinder implements MetadataContributor { private String getDefaultColumnName(PersistentProperty property, String sessionFactoryBeanName) { - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - - String columnName = namingStrategy.toPhysicalColumnName(toIdentifier(property.getName()), getJdbcEnvironment()).toString(); + String columnName = namingStrategyWrapper.getColumnName(property.getName()); if (property instanceof Association) { Association association = (Association) property; boolean isBasic = property instanceof Basic; @@ -2935,12 +2924,12 @@ public class GrailsDomainBinder implements MetadataContributor { } if (!association.isBidirectional() && association instanceof org.grails.datastore.mapping.model.types.OneToMany) { - String prefix = namingStrategy.toPhysicalTableName(toIdentifier(property.getOwner().getName()), getJdbcEnvironment()).toString(); + String prefix = namingStrategyWrapper.getTableName(property.getOwner().getName()); return addUnderscore(prefix, columnName) + FOREIGN_KEY_SUFFIX; } if (property.isInherited() && isBidirectionalManyToOne(property)) { - return namingStrategy.toPhysicalColumnName(toIdentifier(property.getOwner().getName()), getJdbcEnvironment()).toString() + '_'+ columnName + FOREIGN_KEY_SUFFIX; + return namingStrategyWrapper.getColumnName(property.getOwner().getName()) + '_'+ columnName + FOREIGN_KEY_SUFFIX; } return columnName + FOREIGN_KEY_SUFFIX; @@ -2953,8 +2942,7 @@ public class GrailsDomainBinder implements MetadataContributor { private String getForeignKeyForPropertyDomainClass(PersistentProperty property, String sessionFactoryBeanName) { final String propertyName = NameUtils.decapitalize( property.getOwner().getName() ); - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - return namingStrategy.toPhysicalColumnName(toIdentifier(propertyName), getJdbcEnvironment()).toString() + FOREIGN_KEY_SUFFIX; + return namingStrategyWrapper.getColumnName(propertyName) + FOREIGN_KEY_SUFFIX; } private String getIndexColumnName(PersistentProperty property, String sessionFactoryBeanName) { @@ -2962,8 +2950,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (pc != null && pc.getIndexColumn() != null && pc.getIndexColumn().getColumn() != null) { return pc.getIndexColumn().getColumn(); } - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - return namingStrategy.toPhysicalColumnName(toIdentifier(property.getName()), getJdbcEnvironment()).toString() + UNDERSCORE + IndexedCollection.DEFAULT_INDEX_COLUMN_NAME; + return namingStrategyWrapper.getColumnName(property.getName()) + UNDERSCORE + IndexedCollection.DEFAULT_INDEX_COLUMN_NAME; } private String getIndexColumnType(PersistentProperty property, String defaultType) { @@ -2981,9 +2968,7 @@ public class GrailsDomainBinder implements MetadataContributor { if (hasJoinTableColumnNameMapping(pc)) { return pc.getJoinTable().getColumn().getName(); } - - PhysicalNamingStrategy namingStrategy = getPhysicalNamingStrategy(sessionFactoryBeanName); - return namingStrategy.toPhysicalColumnName(toIdentifier(property.getName()), getJdbcEnvironment()).toString() + UNDERSCORE + IndexedCollection.DEFAULT_ELEMENT_COLUMN_NAME; + return namingStrategyWrapper.getColumnName(property.getName()) + UNDERSCORE + IndexedCollection.DEFAULT_ELEMENT_COLUMN_NAME; } private boolean hasJoinTableColumnNameMapping(PropertyConfig pc) { diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyWrapper.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyWrapper.java new file mode 100644 index 0000000000..e6dd571033 --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/NamingStrategyWrapper.java @@ -0,0 +1,25 @@ +package org.grails.orm.hibernate.cfg.domainbinding; + +import org.hibernate.boot.model.naming.PhysicalNamingStrategy; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; + +import static org.hibernate.boot.model.naming.Identifier.toIdentifier; + +public class NamingStrategyWrapper { + + private final PhysicalNamingStrategy namingStrategy; + private final JdbcEnvironment jdbcEnvironment; + + public NamingStrategyWrapper(PhysicalNamingStrategy namingStrategy, JdbcEnvironment jdbcEnvironment) { + this.namingStrategy = namingStrategy; + this.jdbcEnvironment = jdbcEnvironment; + } + + public String getColumnName(String oldColumnName) { + return namingStrategy.toPhysicalColumnName(toIdentifier(oldColumnName), jdbcEnvironment).toString(); + } + + public String getTableName(String oldTableName) { + return namingStrategy.toPhysicalTableName(toIdentifier(oldTableName),jdbcEnvironment).toString(); + } +} diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/Basic.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/Basic.java index eeb728b51a..174fe69871 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/Basic.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/types/Basic.java @@ -14,11 +14,6 @@ */ package org.grails.datastore.mapping.model.types; -import java.beans.PropertyDescriptor; -import java.util.Collection; -import java.util.List; -import java.util.Map; - import org.grails.datastore.mapping.config.Property; import org.grails.datastore.mapping.engine.internal.MappingUtils; import org.grails.datastore.mapping.engine.types.CustomTypeMarshaller; @@ -27,6 +22,12 @@ import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; +import java.beans.PropertyDescriptor; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; + /** * Models a basic collection type such as a list of Strings * @@ -86,6 +87,10 @@ public abstract class Basic<T extends Property> extends ToMany<T> { return componentType; } + public boolean isEnum() { + return Optional.ofNullable(componentType).map(Class::isEnum).orElse(false); + } + @Override public Association getInverseSide() { return null; // basic collection types have no inverse side
