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 a05a82cce7bcffbc1bfbd631774cb9de5ef10593 Author: Walter Duque de Estrada <[email protected]> AuthorDate: Tue Feb 24 06:38:31 2026 -0600 HibernateGormInstanceApi tested --- .../orm/hibernate/HibernateGormInstanceApi.groovy | 49 +------- .../hibernate/HibernateGormInstanceApiSpec.groovy | 130 ++++++++++++++++++++- 2 files changed, 132 insertions(+), 47 deletions(-) diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy index 5bbc0cdeb5..0bd4b3e2df 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy @@ -15,32 +15,23 @@ */ package org.grails.orm.hibernate -import org.codehaus.groovy.runtime.InvokerHelper - -import jakarta.persistence.GenerationType - -import org.hibernate.engine.spi.SessionFactoryImplementor -import org.hibernate.generator.Assigned -import org.hibernate.generator.Generator - import grails.gorm.validation.CascadingValidator import groovy.transform.CompileStatic import jakarta.persistence.FlushModeType +import org.codehaus.groovy.runtime.InvokerHelper import org.grails.datastore.gorm.GormInstanceApi import org.grails.datastore.gorm.GormValidateable import org.grails.datastore.mapping.core.Datastore -import org.grails.datastore.mapping.engine.event.PersistEvent +import org.grails.datastore.mapping.engine.event.ValidationEvent import org.grails.datastore.mapping.model.config.GormProperties import org.grails.datastore.mapping.model.types.Embedded -import org.grails.datastore.mapping.reflect.ClassUtils -import org.grails.datastore.mapping.reflect.EntityReflector -import org.grails.datastore.mapping.engine.event.ValidationEvent import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.model.types.ToOne +import org.grails.datastore.mapping.reflect.ClassUtils +import org.grails.datastore.mapping.reflect.EntityReflector import org.grails.orm.hibernate.cfg.GrailsHibernateUtil -import org.grails.orm.hibernate.query.HibernateHqlQuery import org.grails.orm.hibernate.support.HibernateRuntimeUtils import org.hibernate.HibernateException @@ -165,12 +156,7 @@ class HibernateGormInstanceApi<D> extends GormInstanceApi<D> { } - private boolean isAssignedId(PersistentEntity entity) { - return ((SessionFactoryImplementor) sessionFactory) - .getMappingMetamodel() - .getEntityDescriptor(entity.getName()) - .getGenerator() instanceof Assigned - } + private void runDeferredBinding() { @@ -336,14 +322,6 @@ class HibernateGormInstanceApi<D> extends GormInstanceApi<D> { return true } - private boolean shouldInsert(Map arguments) { - ClassUtils.getBooleanFromMap(ARGUMENT_INSERT, arguments) - } - - private boolean shouldMerge(Map arguments) { - ClassUtils.getBooleanFromMap(ARGUMENT_MERGE, arguments) - } - protected boolean shouldFlush(Map map) { if (map?.containsKey(ARGUMENT_FLUSH)) { return ClassUtils.getBooleanFromMap(ARGUMENT_FLUSH, map) @@ -391,23 +369,6 @@ class HibernateGormInstanceApi<D> extends GormInstanceApi<D> { insertActiveThreadLocal.remove(); } - protected void incrementVersion(Object target) { - if (target instanceof GroovyObject) { - GroovyObject groovyTarget = (GroovyObject) target - MetaProperty versionProp = groovyTarget.metaClass.hasProperty(groovyTarget, GormProperties.VERSION) - if (versionProp != null) { - Object version = groovyTarget.getProperty(GormProperties.VERSION) - if (version instanceof Long) { - groovyTarget.setProperty(GormProperties.VERSION, ++((Long) version)) - } - } - } - } - - SessionFactory getSessionFactory() { - return this.sessionFactory - } - /** * Checks whether a field is dirty * diff --git a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormInstanceApiSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormInstanceApiSpec.groovy index 48b4a5e897..b3e39f984c 100644 --- a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormInstanceApiSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/HibernateGormInstanceApiSpec.groovy @@ -2,17 +2,15 @@ package org.grails.orm.hibernate import grails.gorm.specs.HibernateGormDatastoreSpec -import grails.gorm.specs.entities.Club import grails.persistence.Entity import org.springframework.validation.Errors class HibernateGormInstanceApiSpec extends HibernateGormDatastoreSpec { void setupSpec() { - manager.addAllDomainClasses([HibernateGormInstanceApiSpecPerson]) + manager.addAllDomainClasses([HibernateGormInstanceApiSpecPerson, HibernateGormInstanceApiSpecJob]) } - def setup() { new HibernateGormInstanceApiSpecPerson(firstName: "Fred", lastName: "Flintstone", age: 40).save(flush: true) new HibernateGormInstanceApiSpecPerson(firstName: "Wilma", lastName: "Flintstone", age: 35).save(flush: true) @@ -157,6 +155,132 @@ class HibernateGormInstanceApiSpec extends HibernateGormDatastoreSpec { person.errors instanceof Errors person.errors.hasErrors() } + + void "test save with validate:false skips validation"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "Betty", lastName: "Rubble", age: 36) + when: + def result = person.save(validate: false) + then: + result != null + result.id != null + } + + void "test save with validate:true explicit"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "Betty", lastName: "Rubble", age: 36) + when: + def result = person.save(validate: true) + then: + result != null + } + + void "test save with deepValidate:false"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "Betty", lastName: "Rubble", age: 36) + when: + def result = person.save(deepValidate: false) + then: + result != null + result.id != null + } + + void "test save with explicit flush:false"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "Betty", lastName: "Rubble", age: 36) + when: + def result = person.save(flush: false) + then: + result != null + } + + void "test merge with params"() { + given: + def person = HibernateGormInstanceApiSpecPerson.findByFirstName("Fred") + person.lastName = "Smith" + when: + def merged = person.merge(flush: true) + then: + merged.lastName == "Smith" + } + + void "test isDirty returns false for new unsaved instance"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "New", lastName: "Person", age: 25) + expect: + !person.isDirty() + } + + void "test isDirty(field) returns false for new unsaved instance"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "New", lastName: "Person", age: 25) + expect: + !person.isDirty("firstName") + } + + void "test isDirty(field) returns false for field that has not changed"() { + given: + def person = HibernateGormInstanceApiSpecPerson.findByFirstName("Fred") + person.lastName = "Changed" + expect: + !person.isDirty("firstName") + person.isDirty("lastName") + } + + void "test getDirtyPropertyNames returns empty list for new unsaved instance"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "New", lastName: "Person", age: 25) + expect: + person.getDirtyPropertyNames() == [] + } + + void "test getPersistentValue returns null for new unsaved instance"() { + given: + def person = new HibernateGormInstanceApiSpecPerson(firstName: "New", lastName: "Person", age: 25) + expect: + person.getPersistentValue("firstName") == null + } + + void "test getPersistentValue returns null for unknown field name"() { + given: + def person = HibernateGormInstanceApiSpecPerson.findByFirstName("Fred") + expect: + person.getPersistentValue("nonExistentField") == null + } + + void "test save succeeds on entity with ToOne association already in session"() { + given: + def person = HibernateGormInstanceApiSpecPerson.findByFirstName("Fred") + def job = new HibernateGormInstanceApiSpecJob(title: "Programmer", person: person) + when: + def result = job.save(flush: true) + then: + result != null + result.id != null + } + + void "test save failure on entity with ToOne association calls handleValidationError"() { + given: + def person = HibernateGormInstanceApiSpecPerson.findByFirstName("Fred") + def job = new HibernateGormInstanceApiSpecJob(title: null, person: person) + when: + def result = job.save() + then: + result == null + job.errors.hasErrors() + } +} + +@Entity +class HibernateGormInstanceApiSpecJob { + String title + HibernateGormInstanceApiSpecPerson person + + static belongsTo = [person: HibernateGormInstanceApiSpecPerson] + + static constraints = { + title nullable: false + } } @Entity
