blob: 33216950ca91f4c723e4174086c0abd2e6e6ccd5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2009 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* dclarke - FetchPlan Extension incubator
******************************************************************************/
package test.fetchplan;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import junit.framework.Assert;
import model.Employee;
import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.extension.fetchplan.FetchPlan;
import org.eclipse.persistence.extension.fetchplan.JpaFetchPlanHelper;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.queries.FetchGroupTracker;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.junit.After;
import org.junit.Test;
import testing.EclipseLinkJPAAssert;
import testing.EclipseLinkJPATest;
/**
* Tests to verify that {@link FetchPlan} produced results can be dettached as
* expected and later merged into other transactions in the same and different
* {@link EntityManager} instances.
*
* @author dclarke
* @since EclipseLink 2.0
*/
@SuppressWarnings("unchecked")
@PersistenceContext(unitName = "employee")
public class DetachedResultsTests extends EclipseLinkJPATest {
@Test
public void employeeAddressPhones() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("id");
fetchPlan.addAttribute("firstName");
fetchPlan.addAttribute("lastName");
fetchPlan.addAttribute("address");
fetchPlan.addAttribute("phoneNumbers");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void employeeAddressPhones_Batching() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
query.setHint(QueryHints.BATCH, "e.address");
query.setHint(QueryHints.BATCH, "e.phoneNumbers");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("address");
fetchPlan.addAttribute("phoneNumbers");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void employeeAddressPhones_Joining() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
query.setHint(QueryHints.FETCH, "e.address");
query.setHint(QueryHints.FETCH, "e.phoneNumbers");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("address");
fetchPlan.addAttribute("phoneNumbers");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void managerAddressPhones() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("manager.address");
fetchPlan.addAttribute("manager.phoneNumbers");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void responsibilities() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("responsibilities");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void responsibilitiesBatch() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
query.setHint(QueryHints.BATCH, "e.responsibilities");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("responsibilities");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void managedEmployeesAddress() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.gender IS NOT NULL");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("managedEmployees.address");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void readAllEmployee() throws Exception {
EntityManager em = getEntityManager();
ReadAllQuery raq = new ReadAllQuery(Employee.class);
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("address");
fetchPlan.addAttribute("phoneNumbers");
Query query = JpaHelper.createQuery(raq, em);
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
FetchPlanAssert.assertFetched(fetchPlan, emps);
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
FetchPlanAssert.assertFetched(fetchPlan, detachedEmps);
}
@Test
public void employeeAddress_Batching() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e");
query.setHint(QueryHints.BATCH, "e.address");
FetchPlan fetchPlan = new FetchPlan(Employee.class);
fetchPlan.addAttribute("address");
List<Employee> emps = query.getResultList();
JpaFetchPlanHelper.fetch(em, fetchPlan, emps);
Assert.assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
FetchPlanAssert.assertFetched(fetchPlan, emps);
Assert.assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
for (Employee emp : emps) {
EclipseLinkJPAAssert.assertLoaded(getEMF(), emp, "address");
EclipseLinkJPAAssert.assertNotLoaded(getEMF(), emp, "phoneNumbers");
EclipseLinkJPAAssert.assertNotLoaded(getEMF(), emp, "manager");
EclipseLinkJPAAssert.assertNotLoaded(getEMF(), emp, "projects");
// Assumption that all employees have an address
Assert.assertNotNull(emp.getAddress());
}
List<Employee> detachedEmps = new ArrayList<Employee>(emps.size());
for (Employee emp : emps) {
detachedEmps.add(JpaFetchPlanHelper.copy(em, fetchPlan, emp));
}
for (Employee emp : detachedEmps) {
EclipseLinkJPAAssert.assertLoaded(getEMF(), emp, "address");
EclipseLinkJPAAssert.assertNotLoaded(getEMF(), emp, "phoneNumbers");
EclipseLinkJPAAssert.assertNotLoaded(getEMF(), emp, "manager");
EclipseLinkJPAAssert.assertNotLoaded(getEMF(), emp, "projects");
// Assumption that all employees have an address
Assert.assertNotNull(emp.getAddress());
}
Assert.assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@After
public void clearCache() {
JpaHelper.getServerSession(getEMF()).getIdentityMapAccessor().initializeAllIdentityMaps();
}
@Override
protected void verifyConfig(EntityManager em) {
super.verifyConfig(em);
FetchPlanAssert.verifyEmployeeConfig(getEMF());
}
}