This is an automated email from the ASF dual-hosted git repository.
pcristof pushed a commit to branch OPENJPA-2940
in repository https://gitbox.apache.org/repos/asf/openjpa.git
The following commit(s) were added to refs/heads/OPENJPA-2940 by this push:
new 284a75c8b [OPENJPA-2940][WIP] Implementing PUU.getVersion and
isInstance
284a75c8b is described below
commit 284a75c8b8d3dfe558504969ccd51519ebeff810
Author: Paulo Cristovão de Araújo Silva Filho <[email protected]>
AuthorDate: Fri Jul 18 23:26:52 2025 -0300
[OPENJPA-2940][WIP] Implementing PUU.getVersion and isInstance
* Moved PUU loading tests to test unit already present
* Updated test unit to junit 4.x format
---
.../openjpa/persistence/util/EagerEntity.java | 14 +
.../persistence/util/TestPersistenceUnitUtil.java | 453 ++++++++++++++-------
.../persistence/EntityManagerFactoryImpl.java | 10 +-
.../persistence/OpenJPAPersistenceUtil.java | 20 +
4 files changed, 343 insertions(+), 154 deletions(-)
diff --git
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java
index f1c940456..307642ae8 100644
---
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java
+++
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/EagerEntity.java
@@ -21,6 +21,7 @@ package org.apache.openjpa.persistence.util;
import java.util.List;
import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
@@ -28,6 +29,7 @@ import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Transient;
+import jakarta.persistence.Version;
@Entity
public class EagerEntity {
@@ -49,6 +51,10 @@ public class EagerEntity {
@OneToMany(fetch=FetchType.EAGER)
private List<EagerEntity> eagerSelf;
+
+ @Version
+ @Column(name = "version_")
+ private Integer version;
@Transient
private String transField;
@@ -100,4 +106,12 @@ public class EagerEntity {
public EagerEmbedRel getEagerEmbedRel() {
return eagerEmbedRel;
}
+
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
}
diff --git
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java
index e46afb5f9..54924dff2 100644
---
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java
+++
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/util/TestPersistenceUnitUtil.java
@@ -18,51 +18,80 @@
*/
package org.apache.openjpa.persistence.util;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
+import java.util.stream.Stream;
import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import jakarta.persistence.Persistence;
+import jakarta.persistence.PersistenceConfiguration;
import jakarta.persistence.PersistenceUnitUtil;
+import jakarta.persistence.metamodel.Attribute;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.OpenJPAPersistence;
-import org.apache.openjpa.persistence.test.SingleEMFTestCase;
-
-public class TestPersistenceUnitUtil extends SingleEMFTestCase{
-
- @Override
- public void setUp() {
- setUp(CLEAR_TABLES, EagerEntity.class, LazyEmbed.class,
- LazyEntity.class, EagerEmbed.class, RelEntity.class,
- EagerEmbedRel.class, MapEntity.class,
- MapKeyEmbed.class, MapValEntity.class,
- OneToEntity.class, ToManyLazy.class, ToManyEager.class);
- }
-
- /*
- * Verifies an entity and its persistent attributes are in the proper
- * load state.
- */
- public void testIsLoadedEager() {
- verifyIsLoadedEagerState(true);
- }
-
- /*
- * Verifies an entity and its persistent attributes are in the proper
- * not loaded state.
- */
- public void testNotLoadedLazy() {
- verifyIsLoadedEagerState(false);
- }
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestPersistenceUnitUtil {
+
+ private static EntityManagerFactory emf;
+
+ private EntityManager em;
+
+ @BeforeClass
+ public static void beforeAll() {
+ PersistenceConfiguration conf = new
PersistenceConfiguration("test");
+
conf.property(PersistenceConfiguration.SCHEMAGEN_DATABASE_ACTION,
"drop-and-create");
+ Stream.of(EagerEntity.class, LazyEmbed.class,
+ LazyEntity.class, EagerEmbed.class,
RelEntity.class, EagerEmbedRel.class,
+ MapEntity.class, MapKeyEmbed.class,
MapValEntity.class,
+ OneToEntity.class, ToManyLazy.class,
ToManyEager.class)
+ .forEach(conf::managedClass);
+
+ emf = Persistence.createEntityManagerFactory(conf);
+ }
+
+ /*
+ * Verifies an entity and its persistent attributes are in the proper
load
+ * state.
+ */
+ @Test
+ public void testIsLoadedEager() {
+ verifyIsLoadedEagerState(true);
+ }
+
+ /*
+ * Verifies an entity and its persistent attributes are in the proper
not loaded
+ * state.
+ */
+ @Test
+ public void testNotLoadedLazy() {
+ verifyIsLoadedEagerState(false);
+ }
/*
* Verifies an entity and its persistent attributes are in the proper
* loaded state.
*/
+ @Test
public void testIsLoadedLazy() {
verifyIsLoadedLazyState(true);
}
@@ -71,6 +100,7 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
* Verifies an entity and its persistent attributes are in the proper
* NOT_LOADED state.
*/
+ @Test
public void testNotLoadedEager() {
verifyIsLoadedEagerState(false);
}
@@ -78,19 +108,16 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
/**
* Verifies the use of PersistenceUnitUtil with multiple PU's.
*/
+ @Test
public void testMultiplePUs() {
OpenJPAEntityManagerFactorySPI emf1 =
- (OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.
- createEntityManagerFactory("PUtil1",
- "org/apache/openjpa/persistence/util/" +
- "persistence.xml");
+ (OpenJPAEntityManagerFactorySPI) OpenJPAPersistence.
+
createEntityManagerFactory("PUtil1","org/apache/openjpa/persistence/util/persistence.xml");
assertNotNull(emf1);
OpenJPAEntityManagerFactorySPI emf2 =
- (OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.
- createEntityManagerFactory("PUtil2",
- "org/apache/openjpa/persistence/util/" +
- "persistence.xml");
+ (OpenJPAEntityManagerFactorySPI) OpenJPAPersistence.
+
createEntityManagerFactory("PUtil2","org/apache/openjpa/persistence/util/persistence.xml");
assertNotNull(emf2);
assertNotSame(emf, emf1);
@@ -125,106 +152,15 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
}
- private void verifyPULoadState(EntityManager em,
- PersistenceUnitUtil...puu) {
-
- EagerEntity ee = createEagerEntity();
- assertEquals(false, puu[0].isLoaded(ee));
- assertEquals(false, puu[0].isLoaded(ee,
- "id"));
- assertEquals(false, puu[1].isLoaded(ee));
- assertEquals(false, puu[1].isLoaded(ee,
- "id"));
- assertEquals(false, puu[2].isLoaded(ee));
- assertEquals(false, puu[2].isLoaded(ee,
- "id"));
-
- em.getTransaction().begin();
- em.persist(ee);
- em.getTransaction().commit();
-
- assertEquals(true, puu[0].isLoaded(ee));
- assertEquals(true, puu[0].isLoaded(ee,
- "id"));
- assertEquals(false, puu[1].isLoaded(ee));
- assertEquals(false, puu[1].isLoaded(ee,
- "id"));
- assertEquals(false, puu[2].isLoaded(ee));
- assertEquals(false, puu[2].isLoaded(ee,
- "id"));
- }
-
-
- private void verifyIsLoadedEagerState(boolean loaded) {
- PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
- assertSame(emf, puu);
- EntityManager em = emf.createEntityManager();
- EagerEntity ee = createEagerEntity();
-
- // Vfy LoadState is false for the unmanaged entity
- assertEquals(false, puu.isLoaded(ee));
- assertEquals(false, puu.isLoaded(ee,
- "id"));
-
- em.getTransaction().begin();
- em.persist(ee);
- em.getTransaction().commit();
- em.clear();
-
- if (loaded)
- ee = em.find(EagerEntity.class, ee.getId());
- else
- ee = em.getReference(EagerEntity.class, ee.getId());
-
- assertEquals(loaded, puu.isLoaded(ee));
- assertEquals(loaded, puu.isLoaded(ee, "id"));
- assertEquals(loaded, puu.isLoaded(ee, "name"));
- assertEquals(loaded, puu.isLoaded(ee, "eagerEmbed"));
- assertEquals(false, puu.isLoaded(ee, "transField"));
-
- em.close();
- }
-
- private void verifyIsLoadedLazyState(boolean loaded) {
- PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
- assertSame(emf, puu);
- EntityManager em = emf.createEntityManager();
- LazyEntity le = createLazyEntity();
-
- // Vfy LoadState is false for the unmanaged entity
- assertEquals(false, puu.isLoaded(le));
- assertEquals(false, puu.isLoaded(le,"id"));
-
- em.getTransaction().begin();
- em.persist(le);
- em.getTransaction().commit();
- em.clear();
-
- // Use find or getReference based upon expected state
- if (loaded)
- le = em.find(LazyEntity.class, le.getId());
- else
- le = em.getReference(LazyEntity.class, le.getId());
-
- assertEquals(loaded, puu.isLoaded(le));
- assertEquals(loaded, puu.isLoaded(le, "id"));
-
- // Name is lazy fetch so it should not be loaded
- assertEquals(false, puu.isLoaded(le, "name"));
- assertEquals(loaded, puu.isLoaded(le, "lazyEmbed"));
- assertEquals(false, puu.isLoaded(le, "transField"));
-
- em.close();
- }
-
/*
* Verifies that an entity and attributes are considered loaded if they
* are assigned by the application.
*/
+ @Test
public void testIsApplicationLoaded() {
PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
assertSame(emf, puu);
- EntityManager em = emf.createEntityManager();
+
EagerEntity ee = createEagerEntity();
em.getTransaction().begin();
@@ -245,12 +181,11 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
assertEquals("AppEagerName", ee.getName());
assertEquals(emb, ee.getEagerEmbed());
- em.close();
}
+ @Test
public void testPCMapEager() {
PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
- EntityManager em = emf.createEntityManager();
MapValEntity mve = new MapValEntity();
mve.setIntVal(10);
@@ -261,10 +196,8 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
MapEntity me = new MapEntity();
assertEquals(false, puu.isLoaded(me));
- assertEquals(false, puu.isLoaded(me,
- "mapValEntity"));
- assertEquals(false, puu.isLoaded(me,
- "mapEntities"));
+ assertEquals(false, puu.isLoaded(me,"mapValEntity"));
+ assertEquals(false, puu.isLoaded(me, "mapEntities"));
assertEquals(false, puu.isLoaded(mve));
@@ -272,8 +205,7 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
me.setMapValEntity(mve);
mve.setMapEntity(me);
- HashMap<MapKeyEmbed, MapValEntity> hm =
- new HashMap<>();
+ HashMap<MapKeyEmbed, MapValEntity> hm = new HashMap<>();
hm.put(mke, mve);
me.setMapEntities(hm);
@@ -283,24 +215,20 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
em.getTransaction().commit();
assertEquals(true, puu.isLoaded(me));
- assertEquals(true, puu.isLoaded(me,
- "mapValEntity"));
- assertEquals(true, puu.isLoaded(me,
- "mapEntities"));
+ assertEquals(true, puu.isLoaded(me, "mapValEntity"));
+ assertEquals(true, puu.isLoaded(me, "mapEntities"));
assertEquals(true, puu.isLoaded(mve));
- em.close();
}
/*
* Verify load state is not loaded for null relationships or relationships
* set to null.
*/
+ @Test
public void testSetNullLazyRelationship() {
-
PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
- EntityManager em = emf.createEntityManager();
try {
OneToEntity ote = new OneToEntity();
@@ -349,19 +277,16 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
em.getTransaction().commit();
//Loaded after commit
assertTrue(puu.isLoaded(ote2, "toManyLazy"));
- }
- finally {
+ } finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
}
- em.close();
}
+ @Test
public void testSetNullEagerRelationship() {
-
PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
- EntityManager em = emf.createEntityManager();
try {
OneToEntity ote = new OneToEntity();
@@ -411,15 +336,14 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
em.getTransaction().commit();
//Loaded after commit
assertTrue(puu.isLoaded(ote2, "toManyEager"));
- }
- finally {
+ } finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
}
- em.close();
}
+ @Test
public void testBasicTypeNotLoaded() {
PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
EntityManager em = emf.createEntityManager();
@@ -437,6 +361,211 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
ee = em.find(EagerEntity.class, id);
assertEquals(true, puu.isLoaded(ee));
}
+
+ @Test
+ public void testLoadingLazyAttributeByName() {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+
+ LazyEntity e = emf.callInTransaction(em -> {
+ LazyEntity le = createLazyEntity();
+ em.persist(le);
+ return le;
+ });
+
+ assertFalse(puu.isLoaded(e));
+
+ e = em.find(LazyEntity.class, e.getId());
+
+ assertTrue(puu.isLoaded(e));
+ assertTrue(puu.isLoaded(e, "id"));
+ assertFalse(puu.isLoaded(e, "name"));
+ assertFalse(puu.isLoaded(e, "relEntities"));
+
+ puu.load(e, "name");
+ puu.load(e, "relEntities");
+
+ assertTrue(puu.isLoaded(e, "name"));
+ assertTrue(puu.isLoaded(e, "relEntities"));
+
+ }
+
+ @Test
+ public void testLoadingLazyAttribute() {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+
+ LazyEntity e = emf.callInTransaction(em -> {
+ LazyEntity le = createLazyEntity();
+ em.persist(le);
+ return le;
+ });
+
+ assertFalse(puu.isLoaded(e));
+
+ e = em.find(LazyEntity.class, e.getId());
+
+ Attribute<? super LazyEntity, ?> attr =
em.getMetamodel().entity(LazyEntity.class).getAttribute("name");
+
+ assertTrue(puu.isLoaded(e));
+ assertTrue(puu.isLoaded(e, "id"));
+ assertFalse(puu.isLoaded(e, attr));
+
+ puu.load(e, attr);
+
+ assertTrue(puu.isLoaded(e, "name"));
+ }
+
+ @Test
+ public void testLoadingUnmanagedEntity() {
+ try {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+ LazyEntity e = emf.callInTransaction(em -> {
+ LazyEntity le = createLazyEntity();
+ em.persist(le);
+ return le;
+ });
+ LazyEntity ue = new LazyEntity();
+ ue.setId(e.getId());
+
+ puu.load(ue);
+ fail("Should have thrown IllegalArgumentException");
+ } catch (IllegalArgumentException ex) {
+ assertTrue(ex.getMessage().contains("not persistent"));
+ }
+ }
+
+ @Test
+ public void testLoadingEntity() {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+ LazyEntity e = emf.callInTransaction(em -> {
+ LazyEntity le = createLazyEntity();
+ em.persist(le);
+ return le;
+ });
+
+ LazyEntity det = em.getReference(LazyEntity.class, e.getId());
+
+ assertFalse(puu.isLoaded(det));
+ puu.load(det);
+ assertTrue(puu.isLoaded(det));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testUnmanagedEntity() {
+ EagerEntity ee = createEagerEntity();
+ emf.getPersistenceUnitUtil().getVersion(ee);
+ }
+
+ @Test
+ public void testVersionedEntity() {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+ EagerEntity e = emf.callInTransaction(em -> {
+ EagerEntity ee = createEagerEntity();
+ em.persist(ee);
+ assertNull(puu.getVersion(ee));
+ return ee;
+ });
+ e = em.find(EagerEntity.class, e.getId());
+ int v1 = (int) puu.getVersion(e);
+ assertEquals(1, v1);
+ em.getTransaction().begin();
+ e.setName("Changed name");
+ e = em.merge(e);
+ em.getTransaction().commit();
+
+ assertEquals(2, (int) puu.getVersion(e));
+ }
+
+ @Test
+ public void testUnversionedEntity() {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+ LazyEntity e = emf.callInTransaction(em -> {
+ LazyEntity le = createLazyEntity();
+ em.persist(le);
+ assertNull(puu.getVersion(le));
+ return le;
+ });
+ e = em.find(LazyEntity.class, e.getId());
+ assertNull(puu.getVersion(e));
+ }
+
+ private void verifyIsLoadedEagerState(boolean loaded) {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+ assertSame(emf, puu);
+
+ EagerEntity ee = createEagerEntity();
+
+ assertFalse(puu.isLoaded(ee));
+ assertFalse(puu.isLoaded(ee, "id"));
+
+ em.getTransaction().begin();
+ em.persist(ee);
+ em.getTransaction().commit();
+ em.clear();
+
+ if (loaded) {
+ ee = em.find(EagerEntity.class, ee.getId());
+ } else {
+ ee = em.getReference(EagerEntity.class, ee.getId());
+ }
+
+ assertEquals(loaded, puu.isLoaded(ee));
+ assertEquals(loaded, puu.isLoaded(ee, "id"));
+ assertEquals(loaded, puu.isLoaded(ee, "name"));
+ assertEquals(loaded, puu.isLoaded(ee, "eagerEmbed"));
+ assertFalse(puu.isLoaded(ee, "transField"));
+ }
+
+ private void verifyIsLoadedLazyState(boolean loaded) {
+ PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
+ assertSame(emf, puu);
+ LazyEntity le = createLazyEntity();
+
+ // Vfy LoadState is false for the unmanaged entity
+ assertEquals(false, puu.isLoaded(le));
+ assertEquals(false, puu.isLoaded(le,"id"));
+
+ em.getTransaction().begin();
+ em.persist(le);
+ em.getTransaction().commit();
+ em.clear();
+
+ // Use find or getReference based upon expected state
+ if (loaded)
+ le = em.find(LazyEntity.class, le.getId());
+ else
+ le = em.getReference(LazyEntity.class, le.getId());
+
+ assertEquals(loaded, puu.isLoaded(le));
+ assertEquals(loaded, puu.isLoaded(le, "id"));
+
+ // Name is lazy fetch so it should not be loaded
+ assertEquals(false, puu.isLoaded(le, "name"));
+ assertEquals(loaded, puu.isLoaded(le, "lazyEmbed"));
+ assertEquals(false, puu.isLoaded(le, "transField"));
+
+ em.close();
+ }
+
+ private void verifyPULoadState(EntityManager em, PersistenceUnitUtil...
puu) {
+ EagerEntity ee = createEagerEntity();
+ assertEquals(false, puu[0].isLoaded(ee));
+ assertEquals(false, puu[0].isLoaded(ee, "id"));
+ assertEquals(false, puu[1].isLoaded(ee));
+ assertEquals(false, puu[1].isLoaded(ee, "id"));
+ assertEquals(false, puu[2].isLoaded(ee));
+ assertEquals(false, puu[2].isLoaded(ee, "id"));
+
+ em.getTransaction().begin();
+ em.persist(ee);
+ em.getTransaction().commit();
+
+ assertEquals(true, puu[0].isLoaded(ee));
+ assertEquals(true, puu[0].isLoaded(ee, "id"));
+ assertEquals(false, puu[1].isLoaded(ee));
+ assertEquals(false, puu[1].isLoaded(ee, "id"));
+ assertEquals(false, puu[2].isLoaded(ee));
+ assertEquals(false, puu[2].isLoaded(ee, "id"));
+ }
private EagerEntity createEagerEntity() {
EagerEntity ee = new EagerEntity();
@@ -477,4 +606,24 @@ public class TestPersistenceUnitUtil extends
SingleEMFTestCase{
assertEquals(state, pu.isLoaded(ent, "eagerEmbed"));
assertEquals(false, pu.isLoaded(ent, "transField"));
}
+
+ @AfterClass
+ public static void afterAll() {
+ if (emf != null && emf.isOpen()) {
+ emf.close();
+ }
+ }
+
+ @Before
+ public void beforeEach() {
+ em = emf.createEntityManager();
+ }
+
+ @After
+ public void afterEach() {
+ if (em != null && em.isOpen()) {
+ em.close();
+ }
+ }
+
}
diff --git
a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
index 78bf79a37..71bb288bc 100644
---
a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
+++
b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
@@ -573,12 +573,18 @@ public class EntityManagerFactoryImpl
@Override
public Object getVersion(Object entity) {
- throw new UnsupportedOperationException("Not yet implemented (JPA
3.2)");
+ if (!OpenJPAPersistenceUtil.isManagedBy(this, entity)) {
+ throw new
IllegalArgumentException(_loc.get("invalid_entity_argument",
+ "load", entity == null ? "null" :
Exceptions.toString(entity)).getMessage());
+ }
+ return OpenJPAPersistenceUtil.getVersion(this, entity);
}
@Override
public boolean isInstance(Object entity, Class<?> entityClass) {
- throw new UnsupportedOperationException("Not yet implemented (JPA
3.2)");
+ return entity != null && entityClass != null
+ && OpenJPAPersistenceUtil.isManagedBy(this, entity)
+ && entityClass.isAssignableFrom(entity.getClass());
}
@Override
diff --git
a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java
b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java
index d6ddddb00..e60e00d86 100644
---
a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java
+++
b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/OpenJPAPersistenceUtil.java
@@ -76,6 +76,26 @@ public class OpenJPAPersistenceUtil {
}
return null;
}
+
+ /**
+ * Get version of a persistent entity managed by one of the
+ * entity managers of the specified entity manager factory.
+ *
+ * @param emf the entity manager factory presumed to contain the given
entity
+ * @param entity the entity whose version is desired
+ * @return the version of the entity, or null if it does not have a
version field
+ * or if it was not persisted yet.
+ *
+ */
+ public static Object getVersion(OpenJPAEntityManagerFactory emf, Object
entity) {
+ if (entity instanceof PersistenceCapable pc) {
+ StateManager sm = pc.pcGetStateManager();
+ if (sm != null && sm instanceof OpenJPAStateManager osm) {
+ return osm.getVersion();
+ }
+ }
+ return null;
+ }
/**
* Determines whether the specified state manager is managed by an open