blob: 7ad6795b78501dd6557f0f28100682d11d0f80cf [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.identity.entityasidentity;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestEntityAsIdentityFields extends SingleEMFTestCase {
public void setUp() {
setUp(
Account.class, AccountGroup.class, Person.class,
"openjpa.Compatibility", "reorderMetaDataResolution=true");
}
/**
* Tests for the NullPointerException in MappingInfo.mergeJoinColumn reported in OpenJPA-1141.
*/
public void testEntityAsIdentityField001() {
EntityManager em = null;
em = emf.createEntityManager();
Query query = em.createQuery("SELECT ag from AccountGroup ag");
List resultList = query.getResultList();
em.close();
}
/**
* Test EntityManager persist() and find() with entities with entity relationships as
* part of their identity. Clears persistence context between entity create and find.
*/
public void testEntityAsIdentityField002A() {
EntityManager em = null;
try {
em = emf.createEntityManager();
// Create population
createPopulation(em);
// Clear persistence context, fetch from database
em.clear();
AccountId aId = new AccountId();
aId.setAccountId(1);
aId.setAccountHolder(1);
aId.setGroupId(1);
Account findAccount = em.find(Account.class, aId);
assertTrue(findAccount != null);
} finally {
// Cleanup
if (em != null) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
}
}
/**
* Test EntityManager persist() and find() with entities with entity relationships as
* part of their identity. Does not clear persistence context between entity create and find.
*/
public void testEntityAsIdentityField002B() {
EntityManager em = null;
try {
em = emf.createEntityManager();
// Create population
createPopulation(em);
// Fetch from database
AccountId aId = new AccountId();
aId.setAccountId(1);
aId.setAccountHolder(1);
aId.setGroupId(1);
Account findAccount = em.find(Account.class, aId);
assertTrue(findAccount != null);
} finally {
// Cleanup
if (em != null) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
}
}
/**
* Test EntityManager persist() and find() with entities with entity relationships as
* part of their identity. Uses different EntityManagers for create and find.
*
*/
public void testEntityAsIdentityField002C() {
EntityManager em = null;
EntityManager emPop = null;
try {
emPop = emf.createEntityManager();
em = emf.createEntityManager();
// Create population
createPopulation(emPop);
// Clear persistence context, fetch from database
em.clear();
AccountId aId = new AccountId();
aId.setAccountId(1);
aId.setAccountHolder(1);
aId.setGroupId(1);
Account findAccount = em.find(Account.class, aId);
assertTrue(findAccount != null);
} finally {
// Cleanup
if (em != null) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
if (emPop != null) {
if (emPop.getTransaction().isActive()) {
emPop.getTransaction().rollback();
}
emPop.close();
}
}
}
/**
* Test a query with a where clause that crosses through the identity relationship.
* Clear persistence context before performing the query.
*/
public void testEntityAsIdentityField003A() {
EntityManager em = null;
try {
em = emf.createEntityManager();
// Create population
createPopulation(em);
em.clear();
Query query = em.createQuery("SELECT a FROM Account a WHERE a.accountHolder.id > 5");
List resultList = query.getResultList();
assertEquals(5, resultList.size());
} finally {
// Cleanup
if (em != null) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
}
}
/**
* Test a query with a where clause that crosses through the identity relationship.
* Use a separate EntityManager to populate the database, and a separate EntityManager
* to perform the query
*/
public void testEntityAsIdentityField004A() {
EntityManager em = null;
EntityManager emPop = null;
try {
emPop = emf.createEntityManager();
em = emf.createEntityManager();
// Create population
createPopulation(emPop);
em.clear();
Query query = em.createQuery("SELECT a FROM Account a WHERE a.accountHolder.id > 5");
List resultList = query.getResultList();
assertEquals(5, resultList.size());
} finally {
// Cleanup
if (em != null) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
if (emPop != null) {
if (emPop.getTransaction().isActive()) {
emPop.getTransaction().rollback();
}
emPop.close();
}
}
}
/**
* Database population
*
*/
private void createPopulation(EntityManager em) {
em.getTransaction().begin();
AccountGroup ag = new AccountGroup();
ag.setId(1);
Set<Account> agAccountSet = ag.getAccountSet();
em.persist(ag);
for (int index = 1; index <= 10; index++) {
Person peep = new Person();
peep.setId(index);
peep.setFirstName("John");
peep.setLastName("Doe");
Account account = new Account();
account.setAccountId(index);
account.setAccountHolder(peep);
account.setGroupId((index / 5) + 1);
account.setBalanceInCents(0);
account.setBalanceInDollars(index * 1000);
em.persist(peep);
em.persist(account);
agAccountSet.add(account);
}
em.getTransaction().commit();
}
}