You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2011/06/21 17:46:47 UTC

svn commit: r1138059 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ openjpa-project/src/doc/manual/

Author: curtisr7
Date: Tue Jun 21 15:46:46 2011
New Revision: 1138059

URL: http://svn.apache.org/viewvc?rev=1138059&view=rev
Log:
OPENJPA-1803: Add support for obtaining a connection via EntityManager.unwrap. Patch contributed by Sebastian Laskawiec.

Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
    openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java?rev=1138059&r1=1138058&r2=1138059&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestUnwrap.java Tue Jun 21 15:46:46 2011
@@ -45,7 +45,7 @@ public class TestUnwrap extends SingleEM
             org.apache.openjpa.kernel.Query.class,
             org.apache.openjpa.kernel.QueryImpl.class
         };
-        for (Class c : validCasts) {
+        for (Class<?> c : validCasts) {
             Object unwrapped = query.unwrap(c);
             assertTrue(c.isInstance(unwrapped));
         }
@@ -73,6 +73,24 @@ public class TestUnwrap extends SingleEM
     }
     
     /**
+     * Tests a EntityManager can be unwrapped as an instance of a series of 
+     * class or interface. 
+     */
+    public void testValidOtherUnwrap() {
+        EntityManager em = emf.createEntityManager();
+        
+        Class<?>[] validCasts = new Class[] {
+            java.sql.Connection.class
+        };
+        for (Class<?> c : validCasts) {
+            Object unwrapped = em.unwrap(c);
+            assertTrue(c.isInstance(unwrapped));
+        }
+        
+        em.close();
+    }
+    
+    /**
      * Tests a EntityManager can not be unwrapped as Object class, null or an interface. 
      * And each such failure raises a Persistence Exception and causes an active transaction
      * to rollback.

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=1138059&r1=1138058&r2=1138059&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Tue Jun 21 15:46:46 2011
@@ -30,6 +30,7 @@ import java.io.ObjectStreamClass;
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.sql.Connection;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumSet;
@@ -1660,11 +1661,16 @@ public class EntityManagerImpl
      * that is not wrapped by this receiver.  
      */
     public <T> T unwrap(Class<T> cls) {
-        Object[] delegates = new Object[]{_broker.getInnermostDelegate(),
-            _broker.getDelegate(), _broker, this};
-        for (Object o : delegates) {
-            if (cls != null && cls != Object.class && cls.isInstance(o))
-                return (T)o;
+        if (cls != null && cls != Object.class) {
+            Object[] delegates = new Object[] { _broker.getInnermostDelegate(), _broker.getDelegate(), _broker, this };
+            for (Object o : delegates) {
+                if (cls.isInstance(o))
+                    return (T) o;
+            }
+            // Only call getConnection() once we are certain that is the type that we need to unwrap.
+            if (cls.isAssignableFrom(Connection.class)) {
+                return (T) getConnection();
+            }
         }
         // Set this transaction to rollback only (as per spec) here because the raised exception 
         // does not go through normal exception translation pathways

Modified: openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml?rev=1138059&r1=1138058&r2=1138059&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml (original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Tue Jun 21 15:46:46 2011
@@ -599,14 +599,11 @@ about the database in use (e.g. version,
         </indexterm>
         <para>
 The JPA standard defines how to access JDBC connections from enterprise beans.
-OpenJPA also provides APIs to access an <classname>EntityManager</classname>'s
-connection, or to retrieve a connection directly from the <classname>
+OpenJPA also provides APIs to retrieve a connection directly from the <classname>
 EntityManagerFactory</classname>'s <classname>DataSource</classname>.
         </para>
         <para>
-The 
-<ulink url="../javadoc/org/apache/openjpa/persistence/OpenJPAEntityManager.html">
-<methodname>OpenJPAEntityManager.getConnection</methodname></ulink> method
+The <methodname>EntityManager.unwrap(java.sql.Connection.class)</methodname> method
 returns an <classname>EntityManager</classname>'s connection. If the <classname>
 EntityManager</classname> does not already have a connection, it will obtain
 one. The returned connection is only guaranteed to be transactionally consistent
@@ -624,13 +621,14 @@ connection is not released if a datastor
                 Using the EntityManager's Connection
             </title>
 <programlisting>
-import java.sql.*;
-import org.apache.openjpa.persistence.*;
+import java.sql.Connection;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
 
 ...
 
-OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
-Connection conn = (Connection) kem.getConnection();
+EntityManager em = emf.createEntityManager();
+Connection conn = (Connection) em.unwrap(java.sql.Connection.class);
 
 // do JDBC stuff