blob: 9f62ee3d086b4bea92daf24bebf091d95aa7af43 [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 - Bug 273057: FetchGroup Example
******************************************************************************/
package test;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertTrue;
import static test.FetchGroupAssert.assertFetched;
import static test.FetchGroupAssert.assertNoFetchGroup;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import model.Address;
import model.Employee;
import model.PhoneNumber;
import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.queries.EntityFetchGroup;
import org.eclipse.persistence.queries.FetchGroup;
import org.eclipse.persistence.queries.FetchGroupTracker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import example.Queries;
/**
* Simple tests to verify the functionality of single level FetchGroup usage
*
* @author dclarke
* @since EclipseLink 1.1
*/
public class SimpleNamedFetchGroupTests extends BaseFetchGroupTests {
@Test
public void findDefaultFetchGroup() throws Exception {
EntityManager em = getEntityManager();
Employee emp = Queries.minimumEmployee(em);
assertNotNull(emp);
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp);
emp.getSalary();
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp.getAddress());
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
for (PhoneNumber phone : emp.getPhoneNumbers()) {
assertNoFetchGroup(getEMF(), phone);
}
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
if (emp.getManager() != null) {
assertNoFetchGroup(getEMF(), emp.getManager());
}
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@Test
public void singleResultDefaultFetchGroup() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
Employee emp = (Employee) query.getSingleResult();
assertNotNull(emp);
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp);
emp.getSalary();
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp.getAddress());
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
for (PhoneNumber phone : emp.getPhoneNumbers()) {
assertNoFetchGroup(getEMF(), phone);
}
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
if (emp.getManager() != null) {
assertNoFetchGroup(getEMF(), emp.getManager());
}
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@Test
public void resultListDefaultFetchGroup() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
List<Employee> emps = query.getResultList();
assertNotNull(emps);
assertEquals(1, emps.size());
Employee emp = emps.get(0);
assertNotNull(emp);
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp);
emp.getSalary();
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp.getAddress());
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
for (PhoneNumber phone : emp.getPhoneNumbers()) {
assertNoFetchGroup(getEMF(), phone);
}
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
if (emp.getManager() != null) {
assertNoFetchGroup(getEMF(), emp.getManager());
}
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@Test
public void singleResultNoFetchGroup() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
query.setHint(QueryHints.FETCH_GROUP, null);
Employee emp = (Employee) query.getSingleResult();
assertNotNull(emp);
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp);
emp.getSalary();
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp.getAddress());
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
for (PhoneNumber phone : emp.getPhoneNumbers()) {
assertNoFetchGroup(getEMF(), phone);
}
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
if (emp.getManager() != null) {
assertNoFetchGroup(getEMF(), emp.getManager());
}
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@Test
public void resultListNoFetchGroup() throws Exception {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
query.setHint(QueryHints.FETCH_GROUP, null);
List<Employee> emps = query.getResultList();
assertNotNull(emps);
assertEquals(1, emps.size());
Employee emp = emps.get(0);
assertNotNull(emp);
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp);
emp.getSalary();
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp.getAddress());
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
for (PhoneNumber phone : emp.getPhoneNumbers()) {
assertNoFetchGroup(getEMF(), phone);
}
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
if (emp.getManager() != null) {
assertNoFetchGroup(getEMF(), emp.getManager());
}
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@Test
public void managerFetchGroup() throws Exception {
EntityManager em = getEntityManager();
// Use q query since find will only use default fetch group
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
FetchGroup managerFG = new FetchGroup();
managerFG.addAttribute("manager");
query.setHint(QueryHints.FETCH_GROUP, managerFG);
assertNotNull(JpaHelper.getReadAllQuery(query).getFetchGroup());
assertSame(managerFG, JpaHelper.getReadAllQuery(query).getFetchGroup());
Employee emp = (Employee) query.getSingleResult();
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertFetched(getEMF(), emp, managerFG);
emp.getManager();
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertFetched(getEMF(), emp, managerFG);
emp.getLastName();
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
assertNoFetchGroup(getEMF(), emp);
for (PhoneNumber phone : emp.getPhoneNumbers()) {
assertNoFetchGroup(getEMF(), phone);
}
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls());
}
@Test
public void namedEmptyFetchGroupUsingGetSingleResult() throws Exception {
ClassDescriptor descriptor = JpaHelper.getServerSession(getEMF()).getClassDescriptor(Employee.class);
FetchGroup fetchGroup = new FetchGroup("test");
descriptor.getFetchGroupManager().addFetchGroup(fetchGroup);
assertTrue(fetchGroup.getFetchItems().isEmpty());
assertEquals(2, descriptor.getFetchGroupManager().getFetchGroups().size());
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
query.setHint(QueryHints.FETCH_GROUP_NAME, "test");
Employee emp = (Employee) query.getSingleResult();
assertNotNull(emp);
FetchGroupTracker tracker = (FetchGroupTracker) emp;
assertNotNull(tracker);
FetchGroup usedFG = tracker._persistence_getFetchGroup();
assertNotNull("No FetchGroup found on read Employee", usedFG);
assertEquals(fetchGroup.getName(), usedFG.getName());
assertSame(fetchGroup, ((EntityFetchGroup<?>) usedFG).getParent());
assertEquals(2, fetchGroup.getFetchItems().size());
assertTrue(tracker._persistence_isAttributeFetched("id"));
assertTrue(tracker._persistence_isAttributeFetched("version"));
assertFalse(tracker._persistence_isAttributeFetched("salary"));
assertFalse(tracker._persistence_isAttributeFetched("firstName"));
assertFalse(tracker._persistence_isAttributeFetched("lastName"));
}
@Test
public void namedNamesFetchGroupUsingGetSingleResult() throws Exception {
ClassDescriptor descriptor = getDescriptor("Employee");
FetchGroup fetchGroup = new FetchGroup("names");
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
descriptor.getFetchGroupManager().addFetchGroup(fetchGroup);
assertEquals(2, fetchGroup.getFetchItems().size());
assertEquals(2, descriptor.getFetchGroupManager().getFetchGroups().size());
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID");
query.setParameter("ID", Queries.minimumEmployeeId(em));
query.setHint(QueryHints.FETCH_GROUP_NAME, "names");
Employee emp = (Employee) query.getSingleResult();
assertNotNull(emp);
FetchGroupTracker tracker = (FetchGroupTracker) emp;
assertNotNull(tracker);
FetchGroup usedFG = tracker._persistence_getFetchGroup();
assertNotNull("No FetcGroup found on read Employee", fetchGroup);
assertSame(fetchGroup, ((EntityFetchGroup<?>) usedFG).getParent());
assertEquals(4, fetchGroup.getFetchItems().size());
assertTrue(tracker._persistence_isAttributeFetched("id"));
assertTrue(tracker._persistence_isAttributeFetched("version"));
assertFalse(tracker._persistence_isAttributeFetched("salary"));
assertTrue(tracker._persistence_isAttributeFetched("firstName"));
assertTrue(tracker._persistence_isAttributeFetched("lastName"));
}
@Test
public void joinFetchEmployeeAddressWithDynamicFetchGroup() {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e JOIN FETCH e.address");
FetchGroup fetchGroup = new FetchGroup("names");
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
query.setHint(QueryHints.FETCH_GROUP, fetchGroup);
List<Employee> emps = query.getResultList();
assertNotNull(emps);
}
@Test
public void joinFetchEmployeeAddressPhoneWithDynamicFetchGroup() {
EntityManager em = getEntityManager();
Query query = em.createQuery("SELECT e FROM Employee e JOIN FETCH e.address WHERE e.id IN (SELECT p.id FROM PhoneNumber p)");
FetchGroup fetchGroup = new FetchGroup("names");
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
query.setHint(QueryHints.FETCH_GROUP, fetchGroup);
List<Employee> emps = query.getResultList();
assertNotNull(emps);
}
/**
*
*/
@Before
public void config() throws Exception {
assertConfig(getEMF(), "Employee", null, 0);
assertConfig(getEMF(), "Address", null, 0);
assertConfig(getEMF(), "PhoneNumber", null, 0);
FetchGroup<Employee> namedEmpFG = new FetchGroup<Employee>("Employee.test");
namedEmpFG.addAttribute("firstName");
namedEmpFG.addAttribute("lastName");
getDescriptor("Employee").getFetchGroupManager().addFetchGroup(namedEmpFG);
FetchGroup<PhoneNumber> namedPhoneFG = new FetchGroup<PhoneNumber>("Phone.test");
namedPhoneFG.addAttribute("number");
getDescriptor("PhoneNumber").getFetchGroupManager().addFetchGroup(namedPhoneFG);
FetchGroup<Address> namedAddressFG = new FetchGroup<Address>("Address.test");
namedAddressFG.addAttribute("city");
getDescriptor("Address").getFetchGroupManager().addFetchGroup(namedAddressFG);
assertConfig(getEMF(), "Employee", null, 1);
assertConfig(getEMF(), "Address", null, 1);
assertConfig(getEMF(), "PhoneNumber", null, 1);
JpaHelper.getServerSession(getEMF()).getIdentityMapAccessor().initializeAllIdentityMaps();
}
@After
public void resetFetchGroups() throws Exception {
ClassDescriptor descriptor = getDescriptor("Employee");
if (descriptor.getFetchGroupManager() != null) {
descriptor.getFetchGroupManager().setDefaultFetchGroup(null);
descriptor.getFetchGroupManager().getFetchGroups().clear();
}
descriptor = getDescriptor("Address");
if (descriptor.getFetchGroupManager() != null) {
descriptor.getFetchGroupManager().setDefaultFetchGroup(null);
descriptor.getFetchGroupManager().getFetchGroups().clear();
}
descriptor = getDescriptor("PhoneNumber");
if (descriptor.getFetchGroupManager() != null) {
descriptor.getFetchGroupManager().setDefaultFetchGroup(null);
descriptor.getFetchGroupManager().getFetchGroups().clear();
}
}
}