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