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 2729907dde57d1e58ec1f3ce5c9c2a4628187e13 Author: Walter B Duque de Estrada <[email protected]> AuthorDate: Thu Jan 29 10:49:01 2026 -0600 progress --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 4 +- .../collectionType/CollectionType.java | 77 ++++++++++++++++++++++ .../collectionType/ListCollectionType.java | 29 ++++++++ .../collectionType/MapCollectionType.java | 28 ++++++++ .../collectionType/SetCollectionType.java | 29 ++++++++ 5 files changed, 165 insertions(+), 2 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 b567795dc7..7c5ba1ecb6 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 @@ -997,8 +997,8 @@ public class GrailsDomainBinder implements MetadataContributor { * @param mappings The Hibernate mappings instance * @param path */ - private void bindCollection(ToMany property, Collection collection, - PersistentClass owner, InFlightMetadataCollector mappings, String path, String sessionFactoryBeanName) { + public void bindCollection(ToMany property, Collection collection, + PersistentClass owner, InFlightMetadataCollector mappings, String path, String sessionFactoryBeanName) { // set role String propertyName = getNameForPropertyAndPath(property, path); diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/CollectionType.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/CollectionType.java new file mode 100644 index 0000000000..c2e21d63ca --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/CollectionType.java @@ -0,0 +1,77 @@ +package org.grails.orm.hibernate.cfg.domainbinding.collectionType; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; + +import org.hibernate.MappingException; +import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.boot.spi.MetadataBuildingContext; +import org.hibernate.mapping.Collection; +import org.hibernate.mapping.PersistentClass; + +import org.grails.datastore.mapping.model.types.ToMany; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; +import org.grails.orm.hibernate.cfg.Mapping; +import org.grails.orm.hibernate.cfg.domainbinding.HibernateEntityWrapper; +import org.grails.orm.hibernate.cfg.domainbinding.TypeNameProvider; + +/** + * A Collection type, for the moment only Set is supported + * + * @author Graeme + */ +public abstract class CollectionType { + + protected final Class<?> clazz; + protected final GrailsDomainBinder binder; + protected final MetadataBuildingContext buildingContext; + + private boolean initialized; + + private final Map<Class<?>, CollectionType> INSTANCES = new HashMap<>(); + + public abstract Collection create(ToMany property, PersistentClass owner, + String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException; + + protected CollectionType(Class<?> clazz, GrailsDomainBinder binder) { + this.clazz = clazz; + this.binder = binder; + this.buildingContext = binder.getMetadataBuildingContext(); + } + + @Override + public String toString() { + return clazz.getName(); + } + + private void createInstances() { + + if (initialized) { + return; + } + + initialized = true; + + CollectionType set = new SetCollectionType(binder); + INSTANCES.put(Set.class, set); + INSTANCES.put(SortedSet.class, set); + + INSTANCES.put(List.class, new ListCollectionType(binder)); + INSTANCES.put(java.util.Collection.class, new BagCollectionType(binder)); + INSTANCES.put(Map.class, new MapCollectionType(binder)); + } + + public CollectionType collectionTypeForClass(Class<?> clazz) { + createInstances(); + return INSTANCES.get(clazz); + } + + public String getTypeName(ToMany property) { + Mapping mapping = new HibernateEntityWrapper().getMappedForm(property.getOwner()); + return new TypeNameProvider().getTypeName(property, mapping); + } + +} diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/ListCollectionType.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/ListCollectionType.java new file mode 100644 index 0000000000..68fd9e0baf --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/ListCollectionType.java @@ -0,0 +1,29 @@ +package org.grails.orm.hibernate.cfg.domainbinding.collectionType; + +import java.util.List; + +import org.hibernate.MappingException; +import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.mapping.Collection; +import org.hibernate.mapping.PersistentClass; + +import org.grails.datastore.mapping.model.types.ToMany; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; + +public class ListCollectionType extends CollectionType { + + public ListCollectionType(GrailsDomainBinder binder) { + super(List.class, binder); + } + + @Override + public Collection create(ToMany property, PersistentClass owner, + String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { + org.hibernate.mapping.List coll = new org.hibernate.mapping.List(buildingContext, owner); + coll.setCollectionTable(owner.getTable()); + coll.setTypeName(getTypeName(property)); + binder.bindCollection(property, coll, owner, mappings, path, sessionFactoryBeanName); + return coll; + } + +} diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/MapCollectionType.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/MapCollectionType.java new file mode 100644 index 0000000000..22de22b5c9 --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/MapCollectionType.java @@ -0,0 +1,28 @@ +package org.grails.orm.hibernate.cfg.domainbinding.collectionType; + +import java.util.Map; + +import org.hibernate.MappingException; +import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.mapping.Collection; +import org.hibernate.mapping.PersistentClass; + +import org.grails.datastore.mapping.model.types.ToMany; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; + +public class MapCollectionType extends CollectionType { + + public MapCollectionType(GrailsDomainBinder binder) { + super(Map.class, binder); + } + + @Override + public Collection create(ToMany property, PersistentClass owner, + String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { + org.hibernate.mapping.Map map = new org.hibernate.mapping.Map(buildingContext, owner); + map.setTypeName(getTypeName(property)); + binder.bindCollection(property, map, owner, mappings, path, sessionFactoryBeanName); + return map; + } + +} diff --git a/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/SetCollectionType.java b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/SetCollectionType.java new file mode 100644 index 0000000000..956521a785 --- /dev/null +++ b/grails-data-hibernate6/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/collectionType/SetCollectionType.java @@ -0,0 +1,29 @@ +package org.grails.orm.hibernate.cfg.domainbinding.collectionType; + +import java.util.Set; + +import org.hibernate.MappingException; +import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.mapping.Collection; +import org.hibernate.mapping.PersistentClass; + +import org.grails.datastore.mapping.model.types.ToMany; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; + +public class SetCollectionType extends CollectionType { + + public SetCollectionType(GrailsDomainBinder binder) { + super(Set.class, binder); + } + + @Override + public Collection create(ToMany property, PersistentClass owner, + String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { + org.hibernate.mapping.Set coll = new org.hibernate.mapping.Set(buildingContext, owner); + coll.setCollectionTable(owner.getTable()); + coll.setTypeName(getTypeName(property)); + binder.bindCollection(property, coll, owner, mappings, path, sessionFactoryBeanName); + return coll; + } + +}
