You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jg...@apache.org on 2013/08/22 16:39:44 UTC

svn commit: r1516464 - in /openjpa/branches/2.1.x: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/fetchgroups/TestFetchGroups.java

Author: jgrassel
Date: Thu Aug 22 14:39:43 2013
New Revision: 1516464

URL: http://svn.apache.org/r1516464
Log:
OPENJPA-2414: FinderCache does not consider active Fetch Groups/FetchPlan added Fields

Modified:
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/fetchgroups/TestFetchGroups.java

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java?rev=1516464&r1=1516463&r2=1516464&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java Thu Aug 22 14:39:43 2013
@@ -483,6 +483,8 @@ public class FetchConfigurationImpl
             if (_state.fields == null)
                 _state.fields = new HashSet<String>();
             _state.fields.add(field);
+            
+            _state.fetchGroupIsPUDefault = false;
         } finally {
             unlock();
         }
@@ -507,8 +509,13 @@ public class FetchConfigurationImpl
     public FetchConfiguration removeField(String field) {
         lock();
         try {
-            if (_state.fields != null)
+            if (_state.fields != null) {
                 _state.fields.remove(field);
+                
+                if (_state.fields.size() == 0) {
+                    verifyDefaultPUFetchGroups();
+                }               
+            }
         } finally {
             unlock();
         }

Modified: openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/fetchgroups/TestFetchGroups.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/fetchgroups/TestFetchGroups.java?rev=1516464&r1=1516463&r2=1516464&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/fetchgroups/TestFetchGroups.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/fetchgroups/TestFetchGroups.java Thu Aug 22 14:39:43 2013
@@ -21,6 +21,7 @@ package org.apache.openjpa.persistence.f
 
 import java.util.HashSet;
 
+import org.apache.openjpa.kernel.FetchConfiguration;
 import org.apache.openjpa.persistence.FetchPlan;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
@@ -35,6 +36,9 @@ public class TestFetchGroups extends Sin
     private HashSet<FGEmployee> employeeSet = new HashSet<FGEmployee>();
     private HashSet<FGManager> managerSet = new HashSet<FGManager>();
     
+    private static final String empDescriptionFieldStr =
+            "org.apache.openjpa.persistence.fetchgroups.FGEmployee.description";
+    
     public void setUp() {
         super.setUp(CLEAR_TABLES, 
             FGManager.class, FGDepartment.class, FGEmployee.class, FGAddress.class);
@@ -52,6 +56,12 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -79,6 +89,11 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -92,6 +107,39 @@ public class TestFetchGroups extends Sin
     }
     
     /**
+     * Verify that adding a field to the fetch plan makes a normally JPA determined lazy loaded
+     * field to behave as an eagerly loaded field.
+     */
+    public void testDefaultFetchPlan003() {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        FetchPlan fp = em.getFetchPlan();
+        assertNotNull(fp);
+        
+        fp.addField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        FGManager mgr = managerSet.iterator().next();
+        assertNotNull(mgr);
+        
+        FGManager findMgr = em.find(FGManager.class, mgr.getId());
+        em.close();
+        
+        assertEquals(mgr.getId(), findMgr.getId());
+        assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+        assertEquals(mgr.getLastName(), findMgr.getLastName());
+        assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+    }
+    
+    
+    /**
      * Verify the use of the "openjpa.FetchGroups" property when used to add a fetch group
      * to the default fetch plan.  Note when overriding that "default" must be included in the list.
      */
@@ -108,6 +156,11 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -141,6 +194,11 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("Default")); // Not the same as "default"
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -174,9 +232,15 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("Default")); // Not the same as "default"
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         fp.clearFetchGroups();
         assertNotNull(fp.getFetchGroups());
         assertEquals(0, fp.getFetchGroups().size());
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
         
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
@@ -208,10 +272,17 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("Default")); // Not the same as "default"
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        
         // Remember, OPENJPA-2413 sets the list to be empty instead of containing "default"
         fp.clearFetchGroups();
         assertNotNull(fp.getFetchGroups());
         assertEquals(0, fp.getFetchGroups().size());
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
         
         // Reset to the PCtx default Fetch Plan
         fp.resetFetchGroups();
@@ -220,6 +291,7 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("Default")); // Not the same as "default"
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
         
         // Verify that the PCtx default fetch plan was properly restored.  "default" should not be enabled
         // since it was not listed by openjpa.FetchGroups.
@@ -248,6 +320,11 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -294,6 +371,11 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -325,6 +407,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -342,6 +426,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -358,6 +444,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -375,6 +463,7 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -391,6 +480,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -410,6 +501,8 @@ public class TestFetchGroups extends Sin
         assertEquals(0, fp.getFetchGroups().size());
         assertFalse(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -444,6 +537,12 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -463,6 +562,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -479,6 +580,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -496,6 +599,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -512,6 +617,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -529,6 +636,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -545,6 +654,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -564,6 +675,8 @@ public class TestFetchGroups extends Sin
         assertEquals(0, fp.getFetchGroups().size());
         assertFalse(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -596,6 +709,11 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -627,6 +745,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -644,6 +764,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -660,6 +782,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             // Second find, should rely on the finder cache to reuse generated SQL.
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
@@ -677,6 +801,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -695,6 +821,8 @@ public class TestFetchGroups extends Sin
         assertEquals(0, fp.getFetchGroups().size());
         assertFalse(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -730,6 +858,11 @@ public class TestFetchGroups extends Sin
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
         
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         FGManager mgr = managerSet.iterator().next();
         assertNotNull(mgr);
         
@@ -737,6 +870,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -753,6 +888,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -769,6 +906,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -785,6 +924,8 @@ public class TestFetchGroups extends Sin
         assertEquals(2, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertTrue(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -801,6 +942,8 @@ public class TestFetchGroups extends Sin
         assertEquals(1, fp.getFetchGroups().size());
         assertTrue(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -819,6 +962,8 @@ public class TestFetchGroups extends Sin
         assertEquals(0, fp.getFetchGroups().size());
         assertFalse(fp.getFetchGroups().contains("default"));
         assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
         {
             FGManager findMgr = em.find(FGManager.class, mgr.getId());
             em.clear();
@@ -833,6 +978,342 @@ public class TestFetchGroups extends Sin
         emf2.close();
     }
     
+    /**
+     * Only SQL generated by the PCtx's default fetch plan should be used by the finder cache,
+     * as it currently lacks the ability to distinguish fetch plan configuration in its key value.
+     * The PCtx's default fetch plan is the normal plan not modified by the "openjpa.FetchGroups"
+     * property.
+     * 
+     * In this variant, a find using the default fetch plan is first executed to prime the finder cache.
+     * Finds operating under a modified fetch plan should not utilize sql stored in the finder cache.
+     */
+    public void testFinderCache006() {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        
+        FetchPlan fp = em.getFetchPlan();
+        assertNotNull(fp);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        FGManager mgr = managerSet.iterator().next();
+        assertNotNull(mgr);
+        
+        {
+            // First find, to prime the Finder Cache
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        }
+        
+        {
+            // Second find, should rely on the finder cache to reuse generated SQL.
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        }
+        
+        // Add a field to the fetch plan and verify expected behavior
+        fp.addField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            // Second find, should rely on the finder cache to reuse generated SQL.
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Remove the field previously added, and verify expected behavior
+        fp.removeField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        }   
+        
+        // Add a field to the fetch plan and verify expected behavior
+        fp.addField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            // Second find, should rely on the finder cache to reuse generated SQL.
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Reset the fetch groups, and verify expected behavior (note the reset doesn't remove added fields!)
+        fp.resetFetchGroups();
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Clear all fetch groups, and verify expected behavior (note the reset doesn't remove added fields!)
+        // Note, due to OPENJPA-2413 even though it behaves as if the "default" fetch group is enabled,
+        // it will not show up in the list of active fetch groups.
+        fp.clearFetchGroups();
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(0, fp.getFetchGroups().size());
+        assertFalse(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Clear all fields, and verify expected behavior
+        fp.clearFields();
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(0, fp.getFetchGroups().size());
+        assertFalse(fp.getFetchGroups().contains("default"));
+        assertFalse(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        }
+        
+        em.close();
+    }
+    
+    /**
+     * Only SQL generated by the PCtx's default fetch plan should be used by the finder cache,
+     * as it currently lacks the ability to distinguish fetch plan configuration in its key value.
+     * The PCtx's default fetch plan is the normal plan not modified by the "openjpa.FetchGroups"
+     * property.
+     * 
+     * In this variant, a find using a modified fetch plan is first executed, which should not be added
+     * to the finder cache.  
+     */
+    public void testFinderCache007() {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        
+        FetchPlan fp = em.getFetchPlan();
+        assertNotNull(fp);
+        
+        fp.addField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        
+        FetchConfiguration fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em)
+                .getBroker()
+                .getFetchConfiguration();
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        
+        FGManager mgr = managerSet.iterator().next();
+        assertNotNull(mgr);
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Remove the field, and verify expected behavior
+        fp.removeField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        }   
+        
+        // Restore the field to the fetch plan and verify expected behavior
+        fp.addField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            // Second find, should rely on the finder cache to reuse generated SQL.
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Remove the "DescFetchGroup" fetch group, and verify expected behavior
+        fp.removeField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        } 
+        
+        // Restore the field to the fetch plan and verify expected behavior
+        fp.addField(empDescriptionFieldStr);
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            // Second find, should rely on the finder cache to reuse generated SQL.
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Reset the fetch plan, and verify expected behavior (should not affect fields)
+        fp.resetFetchGroups();
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(1, fp.getFetchGroups().size());
+        assertTrue(fp.getFetchGroups().contains("default"));
+        assertFalse(fp.getFetchGroups().contains("DescFetchGroup"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Clear all fetch groups, and verify expected behavior (should not affect fields)
+        // Note, due to OPENJPA-2413 even though it behaves as if the "default" fetch group is enabled,
+        // it will not show up in the list of active fetch groups.
+        fp.clearFetchGroups();
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(0, fp.getFetchGroups().size());
+        assertFalse(fp.getFetchGroups().contains("default"));
+        assertTrue(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
+        }
+        
+        // Clear all fields, and verify expected behavior
+        fp.clearFields();
+        assertNotNull(fp.getFetchGroups());
+        assertEquals(0, fp.getFetchGroups().size());
+        assertFalse(fp.getFetchGroups().contains("default"));
+        assertFalse(fp.getFields().contains(empDescriptionFieldStr));
+        assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
+        
+        {
+            FGManager findMgr = em.find(FGManager.class, mgr.getId());
+            em.clear();
+            
+            assertEquals(mgr.getId(), findMgr.getId());
+            assertEquals(mgr.getFirstName(), findMgr.getFirstName());
+            assertEquals(mgr.getLastName(), findMgr.getLastName());
+            assertNull(findMgr.getDescription()); // Should be lazy-loaded
+        }
+        
+        em.close();
+    }
+    
     private void createEmployeeData() {
         OpenJPAEntityManager em = emf.createEntityManager();