blob: f9ff9c0ccd3d9ce407dd32ae7f67e811b173412b [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.inheritance;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.openjpa.persistence.inheritance.entities.EntityMapping;
import org.apache.openjpa.persistence.inheritance.entities.EntityMapping.
InheritanceEntityMapping;
import org.apache.openjpa.persistence.inheritance.entities.testinterfaces.
RootEntity;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestInheritanceWithMSCID extends SingleEMFTestCase {
@Override
@SuppressWarnings("unchecked")
public void setUp() {
/*
* All entities used by this test are defined in the enumeration
* EntityMapping.InheritanceEntityMapping.
*/
EntityMapping.InheritanceEntityMapping[] entityClassEnums =
EntityMapping.InheritanceEntityMapping.values();
Class[] entityClassTypes = new Class[entityClassEnums.length];
int idx = 0;
for (EntityMapping.InheritanceEntityMapping eEnum : entityClassEnums) {
entityClassTypes[idx] = eEnum.getEntityClass();
idx++;
}
setUp((Object[]) entityClassTypes);
}
private InheritanceEntityMapping[][] allEntityGroups = {
EntityMapping.PIdJTIDMSC,
EntityMapping.PIdJTCDMSC,
EntityMapping.PIdJTSDMSC,
EntityMapping.PIdSTIDMSC,
EntityMapping.PIdSTCDMSC,
EntityMapping.PIdSTSDMSC
};
/**
* Verifies that each entity type in the inheritance structure can be
* persisted. Entities are not cleared out of the persistence context
* (the L1 cache) when they are created.
*/
@SuppressWarnings("unchecked")
public void testPersistableWithEntitiesInL1Cache() {
EntityManager em = emf.createEntityManager();
for (InheritanceEntityMapping[] tEntities : allEntityGroups ) {
int idx = 0;
try {
for (InheritanceEntityMapping tEntity : tEntities) {
RootEntity entity = (RootEntity)
EntityMapping.createEntityObjectInstance(tEntity);
entity.updateId(idx++);
entity.setRootEntityData("Root " + (idx - 1));
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
}
} catch (Exception e) {
fail("Test failed with Exception\n" + e);
}
List<RootEntity> resultList = (List<RootEntity>) em.createQuery(
"SELECT e FROM " + tEntities[0].getEntityName() +
" e ORDER BY e.id").getResultList();
assertEquals(tEntities.length, resultList.size());
idx = 0;
for (Object obj : resultList) {
RootEntity entity = (RootEntity) obj;
Class<? extends RootEntity> actualType = entity.getClass();
Class<? extends RootEntity> expectedType =
tEntities[idx].getEntityClass();
assertEquals(
"Assert Entity " + (idx + 1) + "is entity of type " +
expectedType, expectedType, actualType);
idx++;
}
}
em.close();
}
/**
* Verifies that each entity type in the inheritance structure can be
* persisted. Entities are cleared out of the persistence context
* (the L1 cache) after they are created.
*/
@SuppressWarnings("unchecked")
public void testPersistableWithEntitiesClearedFromL1Cache() {
EntityManager em = emf.createEntityManager();
for (InheritanceEntityMapping[] tEntities : allEntityGroups ) {
int idx = 0;
try {
for (InheritanceEntityMapping tEntity : tEntities) {
RootEntity entity = (RootEntity)
EntityMapping.createEntityObjectInstance(tEntity);
entity.updateId(idx++);
entity.setRootEntityData("Root " + (idx - 1));
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
em.clear();
}
} catch (Exception e) {
fail("Test failed with Exception\n" + e);
}
List<RootEntity> resultList = (List<RootEntity>) em.createQuery(
"SELECT e FROM " + tEntities[0].getEntityName() +
" e ORDER BY e.id").getResultList();
assertEquals(tEntities.length, resultList.size());
idx = 0;
for (Object obj : resultList) {
RootEntity entity = (RootEntity) obj;
Class<? extends RootEntity> actualType = entity.getClass();
Class<? extends RootEntity> expectedType =
tEntities[idx].getEntityClass();
assertEquals(
"Assert Entity " + (idx + 1) + "is entity of type " +
expectedType, expectedType, actualType);
idx++;
}
}
em.close();
}
/*
* The following tests exercise the following scenario:
*
* Verify that all-inclusive SELECT against an entity that is a member
* of an inheritance hierarchy will include all of its subclasses within
* the query results as well.
*
* Variations of this test include clearing the L1 cache after db
* population and between each Query check, and not clearing the L1
* cache.
*
*/
private boolean[][] queryLogic001AcceptenceMapping = new boolean[][] {
// RootEntity
new boolean[] { true, true, true, true, true, true, true, true,
true },
// Leaf A
new boolean[] { false, true, false, false, false, false, false,
false, false },
// EntityB
new boolean[] { false, false, true, true, true, false, false,
false, false },
// Leaf B1
new boolean[] { false, false, false, true, false, false, false,
false, false },
// Leaf B2
new boolean[] { false, false, false, false, true, false, false,
false, false },
// Leaf C
new boolean[] { false, false, false, false, false, true, false,
false, false },
// Entity D
new boolean[] { false, false, false, false, false, false, true,
true, true },
// Leaf D1
new boolean[] { false, false, false, false, false, false, false,
true, false },
// Leaf D2
new boolean[] { false, false, false, false, false, false, false,
false, true } };
@SuppressWarnings("unchecked")
private void query001TestLogic(boolean clearL1Cache) {
EntityManager em = emf.createEntityManager();
boolean[][] acceptenceMapping = queryLogic001AcceptenceMapping;
for (InheritanceEntityMapping[] tEntities : allEntityGroups ) {
// Populate Database
int idx = 0;
try {
for (InheritanceEntityMapping tEntity : tEntities) {
RootEntity entity = (RootEntity)
EntityMapping.createEntityObjectInstance(tEntity);
entity.updateId(idx++);
entity.setRootEntityData("Root " + (idx - 1));
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
if (clearL1Cache)
em.clear();
}
} catch (Exception e) {
fail("Test failed with Exception\n" + e);
}
// Run through acceptance tests
idx = 0;
for (boolean[] acceptenceMap : acceptenceMapping) {
int expectedQueryResultListSize = 0;
for (boolean acceptence : acceptenceMap) {
if (acceptence)
expectedQueryResultListSize++;
}
String queryStr = "SELECT e FROM " +
tEntities[idx].getEntityName() + " e";
List<RootEntity> resultList = (List<RootEntity>)
em.createQuery(queryStr).getResultList();
assertEquals(
"Assert the following query creates a result list " +
"with " + expectedQueryResultListSize + " entities: " +
"\"" + queryStr + "\". ",
expectedQueryResultListSize,
resultList.size());
idx++;
if (clearL1Cache)
em.clear();
}
}
em.close();
}
/**
* Verify that all-inclusive SELECT against an entity that is a member of an
* inheritance hierarchy will include all of its subclasses within the query
* results as well. Test will not clear the L1 cache after populating DB
* and will not clear the L1 cache in between Query executions.
*/
public void testQuery001WithL1() {
query001TestLogic(false);
}
/**
* Verify that all-inclusive SELECT against an entity that is a member of an
* inheritance hierarchy will include all of its subclasses within the query
* results as well. Test will clear the L1 cache after populating DB
* and will clear the L1 cache in between Query executions.
*/
public void testQuery001NoL1() {
query001TestLogic(true);
}
}