You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2025/06/22 20:39:13 UTC
(openjpa) 02/02: [OPENJPA-2937] Fixing field attachment and storage when using UUID
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 <pc...@gmail.com>
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;
+ }
+
}