blob: 689d1474805a0d38ff3723edb71b99026231bb25 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.fetchgroups;
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;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.test.SingleEMTestCase;
public class TestFetchGroups extends SingleEMTestCase {
private static final int empPerMgr = 5;
private static final int mgrCount = 3;
private static final int empCount = mgrCount * empPerMgr;
private HashSet<FGEmployee> employeeSet = new HashSet<>();
private HashSet<FGManager> managerSet = new HashSet<>();
private static final String empDescriptionFieldStr =
"org.apache.openjpa.persistence.fetchgroups.FGEmployee.description";
@Override
public void setUp() {
super.setUp(CLEAR_TABLES, FGManager.class, FGDepartment.class, FGEmployee.class, FGAddress.class);
createEmployeeData();
}
public void testNoDefaultGroupLazyLoad() {
FGEmployee emp = employeeSet.iterator().next();
OpenJPAEntityManagerSPI em = emf.createEntityManager();
FGEmployee e = em.find(FGEmployee.class, emp.getId());
assertEquals(emp.getFirstName(), e.getFirstName());
em.clear();
em.getFetchPlan().resetFetchGroups().removeFetchGroup("default").addFetchGroups("AddressFetchGroup");
FGEmployee e2 = em.find(FGEmployee.class, emp.getId());
em.clear();
assertNull(e2.getFirstName());
FGEmployee e3 = em.find(FGEmployee.class, emp.getId());
assertEquals(emp.getFirstName(), e3.getFirstName());
em.close();
}
/**
* Verify the "default" fetch plan that models JPA's expected eager/lazy fetch load behaviors.
*/
public void testDefaultFetchPlan001() {
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);
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());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
/**
* Verify that adding a FetchGroup to the fetch plan makes a normally JPA determined lazy loaded field to behave as
* an eagerly loaded field.
*/
public void testDefaultFetchPlan002() {
OpenJPAEntityManager em = emf.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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);
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 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.
*/
public void testPctxDefaultFetchPlan001() {
OpenJPAEntityManagerFactory emf2 =
createNamedEMF(getPersistenceUnitName(), FGManager.class, FGDepartment.class, FGEmployee.class,
FGAddress.class, "openjpa.FetchGroups", "default,DescFetchGroup");
OpenJPAEntityManager em = emf2.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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);
FGManager findMgr = em.find(FGManager.class, mgr.getId());
em.close();
emf2.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 a list not containing "default" is provided, then the
* PCtx's default fetch plan should not include it. This renders fields normally eagerly loaded as per JPA rules to
* behave as lazy loaded fields.
*
* Note that fetch groups are case sensitive, "default" != "Default".
*/
public void testPctxDefaultFetchPlan002() {
OpenJPAEntityManagerFactory emf2 =
createNamedEMF(getPersistenceUnitName(), FGManager.class, FGDepartment.class, FGEmployee.class,
FGAddress.class, "openjpa.FetchGroups", "Default,DescFetchGroup");
OpenJPAEntityManager em = emf2.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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);
FGManager findMgr = em.find(FGManager.class, mgr.getId());
em.close();
emf2.close();
assertEquals(mgr.getId(), findMgr.getId()); // Identity is always loaded
assertNull(findMgr.getFirstName());
assertNull(findMgr.getLastName());
assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
}
/**
* Test clearFetchGroups(), which removes all fetch groups from the fetch plan and reactivates the "default" fetch
* plan.
*
* Note that the method does not place "default" back in the list of active fetch groups, OPENJPA-2413 was opened to
* note this behavior.
*/
public void testClearFetchGroups001() {
OpenJPAEntityManagerFactory emf2 =
createNamedEMF(getPersistenceUnitName(), FGManager.class, FGDepartment.class, FGEmployee.class,
FGAddress.class, "openjpa.FetchGroups", "Default,DescFetchGroup");
OpenJPAEntityManager em = emf2.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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(); // OPENJPA-2413: now places "default" in the list of active fetch groups.
assertNotNull(fp.getFetchGroups());
assertEquals(1, fp.getFetchGroups().size());
assertTrue(fp.getFetchGroups().contains("default"));
assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
FGManager mgr = managerSet.iterator().next();
assertNotNull(mgr);
FGManager findMgr = em.find(FGManager.class, mgr.getId());
em.close();
emf2.close();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
/**
* The resetFetchGroups() method restores the fetch plan's active fetch plans to the PCtx's configured default.
*/
public void testResetFetchGroups001() {
OpenJPAEntityManagerFactory emf2 =
createNamedEMF(getPersistenceUnitName(), FGManager.class, FGDepartment.class, FGEmployee.class,
FGAddress.class, "openjpa.FetchGroups", "Default,DescFetchGroup");
OpenJPAEntityManager em = emf2.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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());
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
assertNotNull(fp.getFetchGroups());
assertEquals(1, fp.getFetchGroups().size());
assertTrue(fp.getFetchGroups().contains("default"));
assertFalse(fetchCfg.isDefaultPUFetchGroupConfigurationOnly());
// Reset to the PCtx default Fetch Plan
fp.resetFetchGroups();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
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.
FGManager mgr = managerSet.iterator().next();
assertNotNull(mgr);
FGManager findMgr = em.find(FGManager.class, mgr.getId());
em.close();
emf2.close();
assertEquals(mgr.getId(), findMgr.getId()); // Identity is always loaded
// assertNull(findMgr.getFirstName()); // Commented out, for OPENJPA-2420
// assertNull(findMgr.getLastName());
assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
}
/**
* Baseline test for Finder Cache
*/
public void testFinderCache001() {
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
}
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 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 testFinderCache002() {
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 fetch group to the fetch plan and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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 fetch group previously added, and verify expected behavior
fp.removeFetchGroup("DescFetchGroup");
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 fetch group to the fetch plan and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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
fp.resetFetchGroups();
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 fetch group to the fetch plan and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
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
}
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 testFinderCache003() {
OpenJPAEntityManager em = emf.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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);
{
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.removeFetchGroup("DescFetchGroup");
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 fetch group to the fetch plan and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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.removeFetchGroup("DescFetchGroup");
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 fetch group to the fetch plan and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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
fp.resetFetchGroups();
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 fetch group to the fetch plan and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
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
}
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 modified by
* the "openjpa.FetchGroups" property.
*/
public void testFinderCache004() {
OpenJPAEntityManagerFactory emf2 =
createNamedEMF(getPersistenceUnitName(), FGManager.class, FGDepartment.class, FGEmployee.class,
FGAddress.class, "openjpa.FetchGroups", "default,DescFetchGroup");
OpenJPAEntityManager em = emf2.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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);
{
// 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());
assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not 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());
assertEquals(mgr.getDescription(), findMgr.getDescription()); // Should not be lazy-loaded
}
// Remove a fetch group to the fetch plan and verify expected behavior
fp.removeFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
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 fetch group previously removed, and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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();
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 a fetch group to the fetch plan and verify expected behavior
fp.removeFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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());
em.clear();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
// Reset the fetch plan, and verify expected behavior
fp.resetFetchGroups();
assertNotNull(fp.getFetchGroups());
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();
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
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
assertNotNull(fp.getFetchGroups());
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();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
em.close();
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 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 testFinderCache005() {
OpenJPAEntityManagerFactory emf2 =
createNamedEMF(getPersistenceUnitName(), FGManager.class, FGDepartment.class, FGEmployee.class,
FGAddress.class, "openjpa.FetchGroups", "default,DescFetchGroup");
OpenJPAEntityManager em = emf2.createEntityManager();
FetchPlan fp = em.getFetchPlan();
assertNotNull(fp);
assertNotNull(fp.getFetchGroups());
assertEquals(2, fp.getFetchGroups().size());
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);
fp.removeFetchGroup("DescFetchGroup");
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();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
// Restore the "DescFetchGroup" fetch group, and verify expected behavior
fp.addFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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();
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.removeFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
// Reset the fetch plan, and verify expected behavior
fp.resetFetchGroups();
assertNotNull(fp.getFetchGroups());
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();
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.removeFetchGroup("DescFetchGroup");
assertNotNull(fp.getFetchGroups());
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();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
// Clear all fetch groups, and verify expected behavior
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
assertNotNull(fp.getFetchGroups());
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();
assertEquals(mgr.getId(), findMgr.getId());
assertEquals(mgr.getFirstName(), findMgr.getFirstName());
assertEquals(mgr.getLastName(), findMgr.getLastName());
assertNull(findMgr.getDescription()); // Should be lazy-loaded
}
em.close();
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!)
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
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 fields, and verify expected behavior
fp.clearFields();
assertNotNull(fp.getFetchGroups());
assertEquals(1, fp.getFetchGroups().size());
assertTrue(fp.getFetchGroups().contains("default"));
assertFalse(fp.getFields().contains(empDescriptionFieldStr));
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
}
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)
// OPENJPA-2413: now places "default" in the list of active fetch groups.
fp.clearFetchGroups();
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 fields, and verify expected behavior
fp.clearFields();
assertNotNull(fp.getFetchGroups());
assertEquals(1, fp.getFetchGroups().size());
assertTrue(fp.getFetchGroups().contains("default"));
assertFalse(fp.getFields().contains(empDescriptionFieldStr));
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
}
em.close();
}
private void createEmployeeData() {
OpenJPAEntityManager em = emf.createEntityManager();
employeeSet.clear();
managerSet.clear();
int empIdIndex = 1;
em.getTransaction().begin();
// Create Managers
for (int i = 1; i < mgrCount; i++) {
int id = empIdIndex++;
FGAddress addr = createAddress(id);
em.persist(addr);
FGDepartment dept = createDepartment(id);
em.persist(dept);
FGManager mgr = new FGManager();
mgr.setId(id);
mgr.setFirstName("First-" + id);
mgr.setLastName("Last-" + id);
mgr.setMData("MData-" + id);
mgr.setRating("Rating-" + id);
mgr.setDescription("Manager-" + id);
mgr.setAddress(addr);
mgr.setDept(dept);
em.persist(mgr);
managerSet.add(mgr);
}
// Create Employees
for (int i = 1; i < empCount; i++) {
int id = empIdIndex++;
int mgrId = (id % empPerMgr) + 1;
FGAddress addr = createAddress(id);
em.persist(addr);
FGDepartment dept = createDepartment(id);
em.persist(dept);
FGEmployee emp = new FGEmployee();
emp.setId(id);
emp.setFirstName("First-" + id);
emp.setLastName("Last-" + id);
emp.setRating("Rating-" + id);
emp.setDescription("Employee-" + id);
emp.setAddress(addr);
emp.setDept(dept);
em.persist(emp);
employeeSet.add(emp);
}
em.getTransaction().commit();
em.close();
}
private FGAddress createAddress(int id) {
FGAddress addr = new FGAddress();
addr.setId(id);
addr.setStreet("Street-" + id);
addr.setCity("City-" + id);
addr.setState("State-" + id);
addr.setZip(id);
return addr;
}
private FGDepartment createDepartment(int id) {
FGDepartment dept = new FGDepartment();
dept.setId(id);
dept.setName("Department-" + id);
return dept;
}
}