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; + } + }
