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 f8404d6cb835ec1d7b14eb9b397286f1f4df3d55
Author: Walter B Duque de Estrada <[email protected]>
AuthorDate: Sun Jan 25 14:23:10 2026 -0600

    progress
---
 .../core/HIBERNATE7-UPGRADE-PROGRESS.md            |   4 +-
 .../proxy/HibernateProxyHandler7Spec.groovy        |  99 +++++++++++++++++++-
 .../tck/tests/UpdateWithProxyPresentSpec.groovy    | 100 +++++++--------------
 3 files changed, 134 insertions(+), 69 deletions(-)

diff --git a/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md 
b/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md
index 2b0fe34cfd..57d3c34c8d 100644
--- a/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md
+++ b/grails-data-hibernate7/core/HIBERNATE7-UPGRADE-PROGRESS.md
@@ -32,4 +32,6 @@ This document summarizes the approaches taken, challenges 
encountered, and futur
 ## Future Steps
 - Fix the `GrailsIncrementGenerator` NPE by ensuring table names are properly 
resolved in Hibernate 7's new initialization phase.
 - Fix `UpdateWithProxyPresentSpec` by ensuring a clean state for proxy loading.
-- Address remaining TCK failures (approx. 16) in the `hibernate 7` module.
\ No newline at end of file
+- Address remaining TCK failures (approx. 16) in the `hibernate 7` module.
+# Important
+- Never make changes in production code without consulting human, even in YOLO 
mode
\ No newline at end of file
diff --git 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler7Spec.groovy
 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler7Spec.groovy
index 99724040db..a50b7db596 100644
--- 
a/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler7Spec.groovy
+++ 
b/grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler7Spec.groovy
@@ -2,6 +2,7 @@ package org.grails.orm.hibernate.proxy
 
 import org.hibernate.proxy.HibernateProxy
 import grails.gorm.specs.HibernateGormDatastoreSpec
+import grails.persistence.Entity
 import org.apache.grails.data.testing.tck.domains.Location
 import org.hibernate.Hibernate
 import spock.lang.Shared
@@ -12,7 +13,7 @@ class HibernateProxyHandler7Spec extends 
HibernateGormDatastoreSpec {
     @Shared HibernateProxyHandler proxyHandler = new HibernateProxyHandler()
 
     void setupSpec() {
-        manager.addAllDomainClasses([Location])
+        
manager.addAllDomainClasses([Location,UpdatePerson,UpdatePet,UpdatePetType ])
     }
 
     void "test isInitialized for a non-proxied object"() {
@@ -122,4 +123,98 @@ class HibernateProxyHandler7Spec extends 
HibernateGormDatastoreSpec {
         cleanup:
         manager.session.mappingContext.proxyFactory = originalFactory
     }
-}
\ No newline at end of file
+
+    void 'Test update entity with association proxies'() {
+        given:
+        def person = new UpdatePerson(firstName: 'Bob', lastName: 'Builder')
+        def petType = new UpdatePetType(name: 'snake')
+        def pet = new UpdatePet(name: 'Fred', type: petType, owner: person)
+        person.addToPets(pet)
+        person.save(flush: true)
+        manager.session.clear()
+
+        when:
+        person = UpdatePerson.get(person.id)
+        person.firstName = 'changed'
+        person.save(flush: true)
+        manager.session.clear()
+        person = UpdatePerson.get(person.id)
+        def personPet = person.pets.iterator().next()
+
+        then:
+        person.firstName == 'changed'
+        personPet.name == 'Fred'
+        personPet.id == pet.id
+        personPet.owner.id == person.id
+        personPet.type.name == 'snake'
+        personPet.type.id == petType.id
+    }
+
+    void 'Test update unidirectional oneToMany with proxy'() {
+        given:
+        Long personId
+        Long petTypeId
+
+        // Step 1: Persist initial data
+        UpdatePerson.withNewSession { gormSession ->
+            UpdatePerson.withTransaction {
+                personId = new UpdatePerson(firstName: 'Bob', lastName: 
'Builder').save(flush: true).id
+                petTypeId = new UpdatePetType(name: 'snake').save(flush: 
true).id
+            }
+        }
+
+        when: "Re-loading in a new session to test proxy behavior"
+        UpdatePerson.withNewSession { gormSession ->
+            UpdatePerson.withTransaction {
+                def person = UpdatePerson.get(personId)
+                def hibernateSession = 
gormSession.getSessionFactory().getCurrentSession()
+
+                // Use the native Hibernate session to ensure a proxy
+                def petTypeProxy = 
hibernateSession.getReference(UpdatePetType, petTypeId)
+
+                // Verify it is indeed a proxy
+                assert proxyHandler.isProxy(petTypeProxy)
+
+                // Create a new pet with the proxy type
+                def pet = new UpdatePet(name: 'Fred', type: petTypeProxy, 
owner: person)
+                person.addToPets(pet)
+                person.save(flush: true)
+            }
+        }
+
+        then: "Verify the association was persisted correctly"
+        def result = UpdatePerson.withNewSession {
+            def person = UpdatePerson.get(personId)
+            return [firstName: person.firstName, petsSize: person.pets.size(), 
petName: person.pets.first()?.name, petTypeId: person.pets.first()?.type?.id]
+        }
+
+        result.firstName == 'Bob'
+        result.petsSize == 1
+        result.petName == 'Fred'
+        result.petTypeId == petTypeId
+    }
+}
+
+@Entity
+class UpdatePerson implements Serializable {
+    Long id
+    String firstName
+    String lastName
+    Set<UpdatePet> pets = []
+    static hasMany = [pets: UpdatePet]
+}
+
+@Entity
+class UpdatePet implements Serializable {
+    Long id
+    String name
+    UpdatePetType type
+    UpdatePerson owner
+    static belongsTo = [owner: UpdatePerson]
+}
+
+@Entity
+class UpdatePetType implements Serializable {
+    Long id
+    String name
+}
diff --git 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy
 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy
index 728e316c7c..4d8e4a2c8c 100644
--- 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy
+++ 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy
@@ -18,33 +18,40 @@
  */
 package org.apache.grails.data.testing.tck.tests
 
-import grails.persistence.Entity
+import spock.lang.IgnoreIf
+
 import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
+import org.apache.grails.data.testing.tck.domains.Child
+import org.apache.grails.data.testing.tck.domains.Parent
+import org.apache.grails.data.testing.tck.domains.Person
+import org.apache.grails.data.testing.tck.domains.Pet
+import org.apache.grails.data.testing.tck.domains.PetType
 
 /**
  * @author graemerocher
  */
+@IgnoreIf({ System.getProperty("hibernate7.gorm.suite") == "true" })
 class UpdateWithProxyPresentSpec extends GrailsDataTckSpec {
 
     void setupSpec() {
-        manager.addAllDomainClasses([UpdatePet, UpdatePerson, UpdatePetType])
+        manager.addAllDomainClasses([Pet, Person, PetType, Parent, Child])
     }
 
     void 'Test update entity with association proxies'() {
         given:
-        def person = new UpdatePerson(firstName: 'Bob', lastName: 'Builder')
-        def petType = new UpdatePetType(name: 'snake')
-        def pet = new UpdatePet(name: 'Fred', type: petType, owner: person)
+        def person = new Person(firstName: 'Bob', lastName: 'Builder')
+        def petType = new PetType(name: 'snake')
+        def pet = new Pet(name: 'Fred', type: petType, owner: person)
         person.addToPets(pet)
         person.save(flush: true)
         manager.session.clear()
 
         when:
-        person = UpdatePerson.get(person.id)
+        person = Person.get(person.id)
         person.firstName = 'changed'
         person.save(flush: true)
         manager.session.clear()
-        person = UpdatePerson.get(person.id)
+        person = Person.get(person.id)
         def personPet = person.pets.iterator().next()
 
         then:
@@ -58,69 +65,30 @@ class UpdateWithProxyPresentSpec extends GrailsDataTckSpec {
 
     void 'Test update unidirectional oneToMany with proxy'() {
         given:
-        Long personId
-        Long petTypeId
-
-        // Step 1: Persist initial data
-        UpdatePerson.withNewSession { gormSession ->
-            UpdatePerson.withTransaction {
-                personId = new UpdatePerson(firstName: 'Bob', lastName: 
'Builder').save(flush: true).id
-                petTypeId = new UpdatePetType(name: 'snake').save(flush: 
true).id
-            }
-        }
+        def parent = new Parent(name: 'Bob').save(flush: true)
+        def child = new Child(name: 'Bill').save(flush: true)
+        manager.session.clear()
 
-        when: "Re-loading in a new session to test proxy behavior"
-        UpdatePerson.withNewSession { gormSession ->
-            UpdatePerson.withTransaction {
-                def person = UpdatePerson.get(personId)
-                def hibernateSession = 
gormSession.getSessionFactory().getCurrentSession()
+        when:
+        parent = Parent.get(parent.id)
+        child = Child.load(child.id) // make sure we've got a proxy.
+        then:
+        manager.session.mappingContext.proxyFactory.isProxy(child) == true
 
-                // Use the native Hibernate session to ensure a proxy
-                def petTypeProxy = 
hibernateSession.getReference(UpdatePetType, petTypeId)
+        when:
+        parent.addToChildren(child)
+        parent.save(flush: true)
+        manager.session.clear()
+        parent = Parent.get(parent.id)
 
-                // Verify it is indeed a proxy
-                assert proxyHandler.isProxy(petTypeProxy)
+        then:
+        parent.name == 'Bob'
+        parent.children.size() == 1
 
-                // Create a new pet with the proxy type
-                def pet = new UpdatePet(name: 'Fred', type: petTypeProxy, 
owner: person)
-                person.addToPets(pet)
-                person.save(flush: true)
-            }
-        }
+        when:
+        child = parent.children.first()
 
-        then: "Verify the association was persisted correctly"
-        def result = UpdatePerson.withNewSession {
-            def person = UpdatePerson.get(personId)
-            return [firstName: person.firstName, petsSize: person.pets.size(), 
petName: person.pets.first()?.name, petTypeId: person.pets.first()?.type?.id]
-        }
-        
-        result.firstName == 'Bob'
-        result.petsSize == 1
-        result.petName == 'Fred'
-        result.petTypeId == petTypeId
+        then:
+        child.name == 'Bill'
     }
 }
-
-@Entity
-class UpdatePerson implements Serializable {
-    Long id
-    String firstName
-    String lastName
-    Set<UpdatePet> pets = []
-    static hasMany = [pets: UpdatePet]
-}
-
-@Entity
-class UpdatePet implements Serializable {
-    Long id
-    String name
-    UpdatePetType type
-    UpdatePerson owner
-    static belongsTo = [owner: UpdatePerson]
-}
-
-@Entity
-class UpdatePetType implements Serializable {
-    Long id
-    String name
-}

Reply via email to