Author: pcl
Date: Thu Jan 18 11:26:39 2007
New Revision: 497547

URL: http://svn.apache.org/viewvc?view=rev&rev=497547
Log:
test case for OPENJPA-102 and OPENJPA-104

Added:
    
incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detachment/TestGetReferenceAndImplicitDetachment.java

Added: 
incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detachment/TestGetReferenceAndImplicitDetachment.java
URL: 
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detachment/TestGetReferenceAndImplicitDetachment.java?view=auto&rev=497547
==============================================================================
--- 
incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detachment/TestGetReferenceAndImplicitDetachment.java
 (added)
+++ 
incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detachment/TestGetReferenceAndImplicitDetachment.java
 Thu Jan 18 11:26:39 2007
@@ -0,0 +1,120 @@
+package org.apache.openjpa.persistence.detachment;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Persistence;
+import javax.persistence.RollbackException;
+
+import org.apache.openjpa.enhance.PersistenceCapable;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+
+import junit.framework.TestCase;
+
+
+public class TestGetReferenceAndImplicitDetachment
+    extends TestCase {
+
+    private OpenJPAEntityManagerFactory emf;
+
+    public void setUp() {
+        String types = DetachmentOneManyParent.class.getName() + ";"
+            + DetachmentOneManyChild.class.getName(); 
+        Map props = new HashMap(System.getProperties());
+        props.put("openjpa.MetaDataFactory", "jpa(Types=" + types + ")");
+        props.put("openjpa.DetachState", "fgs");
+        emf = (OpenJPAEntityManagerFactory) Persistence.
+            createEntityManagerFactory("test", props);
+        deleteAll();
+    }
+
+    public void tearDown() {
+        if (emf == null)
+            return;
+        try {
+            deleteAll();
+            emf.close();
+        } catch (Exception e) {
+        }
+    }
+    
+    private void deleteAll() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        em.createQuery("delete from DetachmentOneManyChild").
+            executeUpdate();
+        em.createQuery("delete from DetachmentOneManyParent").
+            executeUpdate();
+        em.getTransaction().commit();
+        em.close();
+    }
+
+    public void testNonexistentGetReferenceDetachmentInTxWithCommit() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        DetachmentOneManyParent o = 
+            em.getReference(DetachmentOneManyParent.class, 0);
+        em.getTransaction().commit();
+        em.close();
+
+        // the close detachment should leave these invalid objects in a 
+        // transient state
+        assertFalse(((PersistenceCapable) o).pcIsTransactional());
+        assertFalse(((PersistenceCapable) o).pcIsPersistent());
+        // pcIsDetached() will give a false positive in this configuration
+        // assertFalse(((PersistenceCapable) o).pcIsDetached());
+    }
+
+    public void testNonexistentGetReferenceDetachmentOutsideTx() {
+        EntityManager em = emf.createEntityManager();
+        DetachmentOneManyParent o = 
+            em.getReference(DetachmentOneManyParent.class, 0);
+        em.close();
+
+        // the close detachment should leave these invalid objects in a 
+        // transient state
+        assertFalse(((PersistenceCapable) o).pcIsTransactional());
+        assertFalse(((PersistenceCapable) o).pcIsPersistent());
+        // pcIsDetached() will give a false positive in this configuration
+        // assertFalse(((PersistenceCapable) o).pcIsDetached());
+    }
+
+    public void testNonexistentGetReferenceDetachmentInTxWithRollback() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        DetachmentOneManyParent o = 
+            em.getReference(DetachmentOneManyParent.class, 0);
+        em.getTransaction().rollback();
+
+        // the rollback should cause a detachment
+        assertFalse(OpenJPAPersistence.cast(em).isTransactional(o));
+        assertFalse(OpenJPAPersistence.cast(em).isPersistent(o));
+        // pcIsDetached() will give a false positive in this configuration
+        // assertFalse(OpenJPAPersistence.cast(em).isDetached(o));
+
+        em.close();
+    }
+
+    public void testNonexistentGetReferenceDetachmentInTxWithFailedCommit() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        DetachmentOneManyParent o = 
+            em.getReference(DetachmentOneManyParent.class, 0);
+        em.getTransaction().setRollbackOnly();
+        try {
+            em.getTransaction().commit();
+        } catch (RollbackException re) {
+            // expected
+        }
+
+        // the failed commit should cause a detachment
+        assertFalse(OpenJPAPersistence.cast(em).isTransactional(o));
+        assertFalse(OpenJPAPersistence.cast(em).isPersistent(o));
+        // pcIsDetached() will give a false positive in this configuration
+        // assertFalse(OpenJPAPersistence.cast(em).isDetached(o));
+
+        em.close();
+    }
+}


Reply via email to