This is an automated email from the ASF dual-hosted git repository. borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 952b1f535dbecd5a3ab6dc4bf923c383a45b5d22 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Wed Mar 11 21:23:36 2026 -0500 hibernate 7: refactor ClassBinder --- .../orm/hibernate/cfg/HibernateMappingContext.java | 8 +++--- .../cfg/domainbinding/binder/ClassBinder.java | 15 ++++++++--- .../cfg/domainbinding/binder/RootBinder.java | 2 +- .../RootPersistentClassCommonValuesBinder.java | 8 +----- .../hibernate/GrailsHibernatePersistentEntity.java | 5 ++++ .../HibernateEmbeddedPersistentEntity.java | 13 ++++++++++ .../hibernate/HibernatePersistentEntity.java | 13 ++++++++++ .../grails/gorm/specs/RLikeHibernate7Spec.groovy | 4 +-- .../cfg/domainbinding/ClassBinderSpec.groovy | 29 ++++++++++++++++++++++ .../cfg/domainbinding/binder/RootBinderSpec.groovy | 6 ++--- ...ootPersistentClassCommonValuesBinderSpec.groovy | 4 +-- 11 files changed, 83 insertions(+), 24 deletions(-) diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java index d69c5e234a..aed3f004d3 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java @@ -66,16 +66,14 @@ public class HibernateMappingContext extends AbstractMappingContext { * @param contextObject The context object (for example a Spring ApplicationContext) * @param persistentClasses The persistent classes */ - public HibernateMappingContext(HibernateConnectionSourceSettings settings, Object contextObject, Class... persistentClasses) { + public HibernateMappingContext(HibernateConnectionSourceSettings settings, Object contextObject, Class<?>... persistentClasses) { this.mappingFactory = new HibernateMappingFactory(); // The mapping factory needs to be configured before initialize can be safely called initialize(settings); - if (settings != null) { - this.mappingFactory.setDefaultMapping(settings.getDefault().getMapping()); - this.mappingFactory.setDefaultConstraints(settings.getDefault().getConstraints()); - } + this.mappingFactory.setDefaultMapping(settings.getDefault().getMapping()); + this.mappingFactory.setDefaultConstraints(settings.getDefault().getConstraints()); this.mappingFactory.setContextObject(contextObject); this.syntaxStrategy = new JpaMappingConfigurationStrategy(mappingFactory) { @Override diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java index fb580e1013..8635fad54d 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/ClassBinder.java @@ -51,18 +51,25 @@ public class ClassBinder { persistentClass.setJpaEntityName(entityName); persistentClass.setProxyInterfaceName(entityName); persistentClass.setClassName(entityName); - persistentClass.setDynamicInsert(false); - persistentClass.setDynamicUpdate(false); - persistentClass.setSelectBeforeUpdate(false); + persistentClass.setAbstract(persistentEntity.isAbstract()); - boolean autoImport; Mapping mappedForm = persistentEntity.getMappedForm(); + boolean autoImport; if (mappedForm != null) { autoImport = mappedForm.isAutoImport(); + persistentClass.setDynamicInsert(mappedForm.isDynamicInsert()); + persistentClass.setDynamicUpdate(mappedForm.isDynamicUpdate()); + persistentClass.setBatchSize(mappedForm.getBatchSize() != null ? mappedForm.getBatchSize() : 0); } else { autoImport = collector.getMetadataBuildingOptions().getMappingDefaults().isAutoImportEnabled(); + persistentClass.setDynamicInsert(false); + persistentClass.setDynamicUpdate(false); + persistentClass.setBatchSize(0); } + persistentClass.setSelectBeforeUpdate(false); + persistentEntity.setPersistentClass(persistentClass); + if (autoImport) { String unqualified = unqualify(entityName); persistentClass.setJpaEntityName(unqualified); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java index 2eb4cc3ded..1e73138432 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinder.java @@ -71,7 +71,7 @@ public class RootBinder { } Collection<GrailsHibernatePersistentEntity> children = entity.getChildEntities(dataSourceName); - RootClass root = rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity); + RootClass root = rootPersistentClassCommonValuesBinder.bindRoot(entity); if (!children.isEmpty() && entity.isTablePerHierarchy()) { discriminatorPropertyBinder.bindDiscriminatorProperty(root); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinder.java index ff316527ee..7cf4f3adb3 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinder.java @@ -31,8 +31,6 @@ import org.grails.orm.hibernate.cfg.Mapping; import org.grails.orm.hibernate.cfg.PersistentEntityNamingStrategy; import org.grails.orm.hibernate.cfg.domainbinding.hibernate.GrailsHibernatePersistentEntity; -import static java.util.Optional.ofNullable; - public class RootPersistentClassCommonValuesBinder { public static final Logger LOG = LoggerFactory.getLogger(RootPersistentClassCommonValuesBinder.class); @@ -61,10 +59,9 @@ public class RootPersistentClassCommonValuesBinder { this.mappings = mappings; } - public RootClass bindRootPersistentClassCommonValues(@Nonnull GrailsHibernatePersistentEntity domainClass) { + public RootClass bindRoot(@Nonnull GrailsHibernatePersistentEntity domainClass) { RootClass root = new RootClass(this.metadataBuildingContext); - root.setAbstract(domainClass.isAbstract()); classBinder.bindClass(domainClass, root); // get the schema and catalog names from the configuration @@ -80,9 +77,6 @@ public class RootPersistentClassCommonValuesBinder { } root.setLazyPropertiesCacheable(!"non-lazy".equals(cc.getInclude())); } - root.setBatchSize(ofNullable(gormMapping.getBatchSize()).orElse(0)); - root.setDynamicUpdate(gormMapping.getDynamicUpdate()); - root.setDynamicInsert(gormMapping.getDynamicInsert()); var schema = domainClass.getSchema(mappings); diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.java index 181e6e2539..8208e46249 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.java @@ -29,6 +29,7 @@ import java.util.stream.Stream; import jakarta.annotation.Nonnull; import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.mapping.PersistentClass; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; @@ -298,4 +299,8 @@ public interface GrailsHibernatePersistentEntity extends PersistentEntity { default String getComment() { return Optional.ofNullable(getMappedForm()).map(Mapping::getComment).orElse(null); } + + void setPersistentClass(PersistentClass persistentClass); + + PersistentClass getPersistentClass(); } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateEmbeddedPersistentEntity.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateEmbeddedPersistentEntity.java index 645cbb6f5f..fc56307c5e 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateEmbeddedPersistentEntity.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateEmbeddedPersistentEntity.java @@ -18,6 +18,8 @@ */ package org.grails.orm.hibernate.cfg.domainbinding.hibernate; +import org.hibernate.mapping.PersistentClass; + import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; import org.grails.datastore.mapping.model.*; import org.grails.orm.hibernate.cfg.Mapping; @@ -26,6 +28,7 @@ public class HibernateEmbeddedPersistentEntity extends EmbeddedPersistentEntity< implements GrailsHibernatePersistentEntity { private final ClassMapping<Mapping> classMapping; private String dataSourceName; + private PersistentClass persistentClass; public Mapping getMappedForm() { return classMapping.getMappedForm(); @@ -80,4 +83,14 @@ public class HibernateEmbeddedPersistentEntity extends EmbeddedPersistentEntity< public ClassMapping<Mapping> getMapping() { return classMapping; } + + @Override + public void setPersistentClass(PersistentClass persistentClass) { + this.persistentClass = persistentClass; + } + + @Override + public PersistentClass getPersistentClass() { + return persistentClass; + } } diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentEntity.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentEntity.java index 8cb9ea5f6c..e49387a6cb 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentEntity.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentEntity.java @@ -23,6 +23,8 @@ import java.util.Optional; import jakarta.persistence.Entity; +import org.hibernate.mapping.PersistentClass; + import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; import org.grails.datastore.mapping.model.*; import org.grails.orm.hibernate.cfg.Mapping; @@ -37,6 +39,7 @@ public class HibernatePersistentEntity extends AbstractPersistentEntity<Mapping> implements GrailsHibernatePersistentEntity { private final AbstractClassMapping<Mapping> classMapping; private String dataSourceName; + private PersistentClass persistentClass; public HibernatePersistentEntity(Class<?> javaClass, final MappingContext context) { super(javaClass, context); @@ -98,4 +101,14 @@ public class HibernatePersistentEntity extends AbstractPersistentEntity<Mapping> public HibernatePersistentProperty getVersion() { return (HibernatePersistentProperty) version; } + + @Override + public void setPersistentClass(PersistentClass persistentClass) { + this.persistentClass = persistentClass; + } + + @Override + public PersistentClass getPersistentClass() { + return persistentClass; + } } diff --git a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/RLikeHibernate7Spec.groovy b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/RLikeHibernate7Spec.groovy index c688bc98c7..ad9ddf1e30 100644 --- a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/RLikeHibernate7Spec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/RLikeHibernate7Spec.groovy @@ -29,13 +29,13 @@ import spock.lang.Shared import spock.lang.Unroll @Testcontainers -@Requires({ HibernateGormDatastoreSpec.isDockerAvailable() }) +@Requires({ isDockerAvailable() }) class RLikeHibernate7Spec extends HibernateGormDatastoreSpec { @Shared postgres = new PostgreSQLContainer("postgres:16") @Shared mysql = new MySQLContainer("mysql:8.0") @Shared mariadb = new MariaDBContainer("mariadb:10.11") - @Shared oracle = new OracleContainer("gvenzl/oracle-free:23-slim") + @Shared oracle = new OracleContainer("gvenzl/oracle-free:slim-faststart") void setupSpec() { manager.addAllDomainClasses([RlikeFoo]) diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ClassBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ClassBinderSpec.groovy index 39d060308f..b9d53c9795 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ClassBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/ClassBinderSpec.groovy @@ -30,6 +30,7 @@ class ClassBinderSpec extends HibernateGormDatastoreSpec { !root.useDynamicInsert() !root.useDynamicUpdate() !root.hasSelectBeforeUpdate() + root.getBatchSize() == 0 collector.getImports()[simpleName] == persistentName } @@ -55,6 +56,7 @@ class ClassBinderSpec extends HibernateGormDatastoreSpec { !root.useDynamicInsert() !root.useDynamicUpdate() !root.hasSelectBeforeUpdate() + root.getBatchSize() == 0 collector.getImports()[simpleName] == persistentName } @@ -80,8 +82,35 @@ class ClassBinderSpec extends HibernateGormDatastoreSpec { !root.useDynamicInsert() !root.useDynamicUpdate() !root.hasSelectBeforeUpdate() + root.getBatchSize() == 0 !collector.getImports()[simpleName] } + void "Test dynamic update and insert true"() { + when: + + def collector = getCollector() + def grailsDomainBinder = getGrailsDomainBinder() + + def simpleName = "Book" + def persistentName = "foo.Book" + def persistentEntity = createPersistentEntity(grailsDomainBinder,simpleName, [:], [dynamicUpdate: "true", dynamicInsert: "true", batchSize: "10"]) + def root = new RootClass(grailsDomainBinder.metadataBuildingContext); + def binder = new ClassBinder(collector) + + binder.bindClass(persistentEntity,root) + then: + root.getEntityName() == persistentName + root.getJpaEntityName() == simpleName + root.getProxyInterfaceName() == persistentName + root.getClassName() == persistentName + root.isLazy() + root.useDynamicInsert() + root.useDynamicUpdate() + !root.hasSelectBeforeUpdate() + root.getBatchSize() == 10 + collector.getImports()[simpleName] == persistentName + } + } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy index 6baf5c9f56..0a42629250 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootBinderSpec.groovy @@ -57,7 +57,7 @@ class RootBinderSpec extends HibernateGormDatastoreSpec { binder.bindRoot(entity) then: - 1 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity) >> rootClass + 1 * rootPersistentClassCommonValuesBinder.bindRoot(entity) >> rootClass 0 * discriminatorPropertyBinder.bindDiscriminatorProperty(_) 0 * subClassBinder.bindSubClass(_, _) 1 * multiTenantFilterBinder.bind(entity, rootClass) @@ -84,7 +84,7 @@ class RootBinderSpec extends HibernateGormDatastoreSpec { binder.bindRoot(entity) then: - 1 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(entity) >> rootClass + 1 * rootPersistentClassCommonValuesBinder.bindRoot(entity) >> rootClass 1 * discriminatorPropertyBinder.bindDiscriminatorProperty(rootClass) 1 * subClassBinder.bindSubClass(childEntity, rootClass) >> [] 1 * multiTenantFilterBinder.bind(entity, rootClass) @@ -105,6 +105,6 @@ class RootBinderSpec extends HibernateGormDatastoreSpec { binder.bindRoot(entity) then: - 0 * rootPersistentClassCommonValuesBinder.bindRootPersistentClassCommonValues(_, _) + 0 * rootPersistentClassCommonValuesBinder.bindRoot(_, _) } } diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy index fbb838dbe5..7c50d612a0 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/RootPersistentClassCommonValuesBinderSpec.groovy @@ -53,7 +53,7 @@ class RootPersistentClassCommonValuesBinderSpec extends HibernateGormDatastoreSp def mappings = getCollector() when: - RootClass rootClass = binder.bindRootPersistentClassCommonValues(entity) + RootClass rootClass = binder.bindRoot(entity) then: 1 * classPropertiesBinder.bindClassProperties(entity, _) @@ -69,7 +69,7 @@ class RootPersistentClassCommonValuesBinderSpec extends HibernateGormDatastoreSp def mappings = getCollector() when: - RootClass rootClass = binder.bindRootPersistentClassCommonValues(entity) + RootClass rootClass = binder.bindRoot(entity) then: rootClass != null
