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 6cb305081711dfb51ee8f02441fec94c0b8262fd Author: Walter Duque de Estrada <[email protected]> AuthorDate: Sat Jul 5 00:39:38 2025 -0500 checked in GrailsDomainBinderSpec --- .../orm/hibernate/cfg/GrailsDomainBinder.java | 2 +- .../hibernate/cfg/GrailsDomainBinderSpec.groovy | 84 ++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) 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 b3ea9b160e..df28d6aad7 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 @@ -1371,7 +1371,7 @@ public class GrailsDomainBinder implements MetadataContributor { * @param mappings The Hibernate Mappings object * @param sessionFactoryBeanName the session factory bean name */ - private void bindRoot(HibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { + protected void bindRoot(HibernatePersistentEntity entity, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { if (mappings.getEntityBinding(entity.getName()) != null) { LOG.info("[GrailsDomainBinder] Class [" + entity.getName() + "] is already mapped, skipping.. "); return; diff --git a/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinderSpec.groovy b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinderSpec.groovy new file mode 100644 index 0000000000..a719f62130 --- /dev/null +++ b/grails-data-hibernate6/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinderSpec.groovy @@ -0,0 +1,84 @@ +package org.grails.orm.hibernate.cfg + +import grails.gorm.specs.HibernateGormDatastoreSpec +import org.hibernate.boot.MetadataSources +import org.hibernate.boot.internal.BootstrapContextImpl +import org.hibernate.boot.internal.InFlightMetadataCollectorImpl +import org.hibernate.boot.internal.MetadataBuilderImpl +import org.hibernate.boot.registry.BootstrapServiceRegistry +import org.hibernate.boot.registry.StandardServiceRegistryBuilder +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService +import org.hibernate.internal.SessionFactoryImpl +import org.hibernate.service.spi.ServiceRegistryImplementor +import org.hibernate.dialect.H2Dialect +import org.hibernate.boot.spi.MetadataContributor + +class GrailsDomainBinderSpec extends HibernateGormDatastoreSpec { + + void "Test save()"() { + when: + + def collector = getCollector() + def grailsDomainBinder = getGrailsDomainBinder() + def persistentEntity = createPersistentEntity("Book", [title: String, author: String, publishedYear: Integer]) + grailsDomainBinder.bindRoot(persistentEntity, collector,"sessionFactoryName") + println("when") + then: + 1 == 1 + } + + HibernatePersistentEntity createPersistentEntity(String className, Map<String, Class> properties) { + def classLoader = new GroovyClassLoader() + def classText = """ + import grails.gorm.annotation.Entity + import grails.gorm.hibernate.HibernateEntity + @Entity + class ${className} implements HibernateEntity<${className}> { + ${properties.collect { name, type -> "${type.simpleName} ${name}" }.join('\n ')} + + static mapping = { + id generator: 'native' + version false + } + } + """ + + def clazz = classLoader.parseClass(classText) + getMappingContext().addPersistentEntity(clazz) as HibernatePersistentEntity + } + + private InFlightMetadataCollectorImpl getCollector() { + def bootstrapServiceRegistry = getServiceRegistry() + .getParentServiceRegistry() + .getParentServiceRegistry() as BootstrapServiceRegistry + def serviceRegistry = new StandardServiceRegistryBuilder(bootstrapServiceRegistry) + .applySetting("hibernate.dialect", H2Dialect.class.getName()) + .applySetting("jakarta.persistence.jdbc.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1") + .applySetting("jakarta.persistence.jdbc.driver", "org.h2.Driver") + .build() + def options = new MetadataBuilderImpl( + new MetadataSources(serviceRegistry) + ).getMetadataBuildingOptions() + new InFlightMetadataCollectorImpl( + new BootstrapContextImpl( serviceRegistry, options) + , options); + } + + private HibernateMappingContext getMappingContext() { + manager.hibernateDatastore.getMappingContext() + } + + private GrailsDomainBinder getGrailsDomainBinder() { + def registry = getServiceRegistry() + registry + .getParentServiceRegistry() + .getService(ClassLoaderService.class) + .loadJavaServices(MetadataContributor.class) + .find { it instanceof GrailsDomainBinder } + } + + private ServiceRegistryImplementor getServiceRegistry() { + (manager.hibernateDatastore.sessionFactory as SessionFactoryImpl) + .getServiceRegistry() + } +} \ No newline at end of file
