This is an automated email from the ASF dual-hosted git repository.

pcristof pushed a commit to branch OPENJPA-2937
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit bcf65f84519784b334dcd13e850bcd34d483cc49
Author: Paulo Cristovão de Araújo Silva Filho <[email protected]>
AuthorDate: Sun Jun 22 17:37:26 2025 -0300

    [OPENJPA-2937] Fixing field attachment and storage when using UUID
    
    * Fixed merging auto-generated UUID valued entity when it was not 
previously persisted
    * Fixed storage of query when using UUID fields
---
 .../apache/openjpa/jdbc/kernel/JDBCStoreQuery.java |  1 +
 .../org/apache/openjpa/kernel/AttachStrategy.java  |  1 +
 .../generationtype/TestUuidGeneratedEntity.java    | 63 ++++++++++++++++++++++
 .../generationtype/UuidGeneratedEntity.java        | 13 +++++
 4 files changed, 78 insertions(+)

diff --git 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
index ebd107f2d..e032bcbbd 100644
--- 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
+++ 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
@@ -1048,6 +1048,7 @@ public class JDBCStoreQuery
         case JavaTypes.BIGINTEGER:
         case JavaTypes.LOCALE:
         case JavaTypes.OBJECT:
+        case JavaTypes.UUID_OBJ:
         case JavaTypes.OID:
             return sm.fetchObjectField(i);
         default:
diff --git 
a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java 
b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java
index 6b3e657e7..7a9ee8f30 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java
@@ -201,6 +201,7 @@ abstract class AttachStrategy
             case JavaTypes.OBJECT:
             case JavaTypes.OID:
             case JavaTypes.ENUM:
+            case JavaTypes.UUID_OBJ:
                 val = fetchObjectField(i);
                 if (val == null && !nullLoaded)
                     return false;
diff --git 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestUuidGeneratedEntity.java
 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestUuidGeneratedEntity.java
index 9796bea0d..be205c17a 100644
--- 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestUuidGeneratedEntity.java
+++ 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestUuidGeneratedEntity.java
@@ -74,6 +74,69 @@ public class TestUuidGeneratedEntity extends 
SingleEMFTestCase {
         closeEM(em);
     }
 
+    public void testMergeBeforePersist() {
+        EntityManager em = emf.createEntityManager();
+
+        UuidGeneratedEntity gv1 = new UuidGeneratedEntity();
+
+        em.getTransaction().begin();
+        gv1 = em.merge(gv1);
+        em.getTransaction().commit();
+
+        em.refresh(gv1);
+
+        assertNotNull(gv1.getId());
+        assertNotNull(gv1.getNativeUuid());
+        closeEM(em);
+    }
+
+    public void testDetachAndMerge() {
+        EntityManager em = emf.createEntityManager();
+        UuidGeneratedEntity gv = new UuidGeneratedEntity();
+        gv.setBasicUuid(UUID.randomUUID());
+
+        em.getTransaction().begin();
+        em.persist(gv);
+        em.getTransaction().commit();
+
+        assertTrue(em.contains(gv));
+        em.detach(gv);
+        em.clear();
+        assertFalse(em.contains(gv));
+
+        Long v = gv.getVersion();
+        gv.setBasicUuid(UUID.randomUUID());
+
+        em.getTransaction().begin();
+        gv = em.merge(gv);
+        em.getTransaction().commit();
+
+        assertTrue((v + 1) == gv.getVersion());
+
+        closeEM(em);
+    }
+
+    public void testGetByReference() {
+        EntityManager em = emf.createEntityManager();
+        UuidGeneratedEntity gv = new UuidGeneratedEntity();
+
+        em.getTransaction().begin();
+        em.persist(gv);
+        em.getTransaction().commit();
+
+        assertTrue(em.contains(gv));
+        em.detach(gv);
+        UUID id = gv.getId();
+        UUID nid = gv.getNativeUuid();
+
+        em.getTransaction().begin();
+        UuidGeneratedEntity rgv = em.getReference(UuidGeneratedEntity.class, 
id);
+        assertEquals(nid, rgv.getNativeUuid());
+        em.getTransaction().commit();
+
+        closeEM(em);
+    }
+
     public void testFindByUUIDProperty() {
         EntityManager em = emf.createEntityManager();
 
diff --git 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/UuidGeneratedEntity.java
 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/UuidGeneratedEntity.java
index 6c1909932..b8907bc96 100644
--- 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/UuidGeneratedEntity.java
+++ 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/UuidGeneratedEntity.java
@@ -27,6 +27,7 @@ import jakarta.persistence.Entity;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.Id;
 import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Version;
 
 @Entity
 public class UuidGeneratedEntity {
@@ -46,6 +47,10 @@ public class UuidGeneratedEntity {
 
     private UUID basicUuid;
 
+    @Version
+    @Column(name = "version_")
+    private Long version;
+
     @ManyToOne
     private UuidGeneratedEntity parent;
      
@@ -93,4 +98,12 @@ public class UuidGeneratedEntity {
         this.parent = parent;
     }
     
+    public Long getVersion() {
+        return version;
+    }
+
+    public void setVersion(Long version) {
+        this.version = version;
+    }
+    
 }

Reply via email to