blob: dd47f44a379635984f7da6d1e985b868817f2f61 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// 03/26/2008-1.0M6 Guy Pelletier
// - 211302: Add variable 1-1 mapping support to the EclipseLink-ORM.XML Schema
// 12/02/2010-2.2 Guy Pelletier
// - 251554: ExcludeDefaultMapping annotation needed
package org.eclipse.persistence.testing.tests.jpa.relationships;
import java.util.Iterator;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import jakarta.persistence.EntityManager;
import jakarta.persistence.NoResultException;
import jakarta.persistence.NonUniqueResultException;
import jakarta.persistence.PersistenceException;
import jakarta.persistence.Query;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.descriptors.copying.CloneCopyPolicy;
import org.eclipse.persistence.descriptors.copying.CopyPolicy;
import org.eclipse.persistence.descriptors.copying.InstantiationCopyPolicy;
import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.internal.sessions.CollectionChangeRecord;
import org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork;
import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
import org.eclipse.persistence.exceptions.QueryException;
import org.eclipse.persistence.internal.jpa.EJBQueryImpl;
import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.internal.queries.MapContainerPolicy;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.relationships.Auditor;
import org.eclipse.persistence.testing.models.jpa.relationships.CustomerCollection;
import org.eclipse.persistence.testing.models.jpa.relationships.CustomerServiceRepresentative;
import org.eclipse.persistence.testing.models.jpa.relationships.Lego;
import org.eclipse.persistence.testing.models.jpa.relationships.Item;
import org.eclipse.persistence.testing.models.jpa.relationships.Mattel;
import org.eclipse.persistence.testing.models.jpa.relationships.MegaBrands;
import org.eclipse.persistence.testing.models.jpa.relationships.Namco;
import org.eclipse.persistence.testing.models.jpa.relationships.OrderCard;
import org.eclipse.persistence.testing.models.jpa.relationships.OrderLabel;
import org.eclipse.persistence.testing.models.jpa.relationships.RelationshipsExamples;
import org.eclipse.persistence.testing.models.jpa.relationships.RelationshipsTableManager;
import org.eclipse.persistence.testing.models.jpa.relationships.Order;
import org.eclipse.persistence.testing.models.jpa.relationships.ServiceCall;
import org.eclipse.persistence.testing.models.jpa.relationships.TestInstantiationCopyPolicy;
import org.eclipse.persistence.testing.models.jpa.relationships.Customer;
public class RelationshipModelJUnitTestSuite extends JUnitTestCase {
private static Integer itemId;
public RelationshipModelJUnitTestSuite() {
super();
}
public RelationshipModelJUnitTestSuite(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("RelationshipModelJUnitTestSuite");
suite.addTest(new RelationshipModelJUnitTestSuite("testSetup"));
suite.addTest(new RelationshipModelJUnitTestSuite("testCreateItem"));
suite.addTest(new RelationshipModelJUnitTestSuite("testModifyItem"));
suite.addTest(new RelationshipModelJUnitTestSuite("testVerifyItem"));
suite.addTest(new RelationshipModelJUnitTestSuite("testInstantiationCopyPolicy"));
suite.addTest(new RelationshipModelJUnitTestSuite("testCopyPolicy"));
suite.addTest(new RelationshipModelJUnitTestSuite("testCloneCopyPolicy"));
suite.addTest(new RelationshipModelJUnitTestSuite("testCollectionImplementation"));
suite.addTest(new RelationshipModelJUnitTestSuite("testCustomerServiceRepMap"));
suite.addTest(new RelationshipModelJUnitTestSuite("testOne2OneRelationTables"));
suite.addTest(new RelationshipModelJUnitTestSuite("testExecuteUpdateTest"));
suite.addTest(new RelationshipModelJUnitTestSuite("testGetResultCollectionTest"));
suite.addTest(new RelationshipModelJUnitTestSuite("testGetResultListTest"));
suite.addTest(new RelationshipModelJUnitTestSuite("testGetSingleResultTest"));
suite.addTest(new RelationshipModelJUnitTestSuite("testNamedQueryDoesNotExistTest"));
suite.addTest(new RelationshipModelJUnitTestSuite("testNamedQueryDoesNotExistTest"));
suite.addTest(new RelationshipModelJUnitTestSuite("testExcludeDefaultMappings"));
suite.addTest(new RelationshipModelJUnitTestSuite("testChangeSetForNewObject"));
return suite;
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the server.
*/
public void testSetup() {
new RelationshipsTableManager().replaceTables(JUnitTestCase.getServerSession());
clearCache();
}
/**
* Verifies the exclude default mappings annotation.
*/
public void testExcludeDefaultMappings() {
ClassDescriptor descriptor = getServerSession().getDescriptor(Mattel.class);
assertNull("The 'ignoredBasic' attribute from the clas Mattel was mapped despite an exclude-default-mappings setting of true.", descriptor.getMappingForAttributeName("ignoredBasic"));
assertNull("The 'ignoredOneToOne' attribute from the clas Mattel was mapped despite an exclude-default-mappings setting of true.", descriptor.getMappingForAttributeName("ignoredOneToOne"));
assertNull("The 'ignoredVariableOneToOne' attribute from the clas Mattel was mapped despite an exclude-default-mappings setting of true.", descriptor.getMappingForAttributeName("ignoredVariableOneToOne"));
assertNull("The 'ignoredOneToMany' attribute from the clas Mattel was mapped despite an exclude-default-mappings setting of true.", descriptor.getMappingForAttributeName("ignoredOneToMany"));
}
/**
* Create a new item that has a variable one to one to a manufacturer.
*/
public void testCreateItem() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Item item = new Item();
item.setName("Synergizer2000");
item.setDescription("Every kid must have one ... ");
// Manufacturer does not cascade persist
Mattel mattel = new Mattel();
mattel.setName("Mattel Inc.");
em.persist(mattel);
item.setManufacturer(mattel);
// Distributor will cascade persist
Namco namco = new Namco();
namco.setName("Namco Games");
item.setDistributor(namco);
em.persist(item);
itemId = item.getItemId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
closeEntityManager(em);
}
/**
* Read an item, verify it contents, modify it and commit.
*/
public void testModifyItem() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Item item = em.find(Item.class, itemId);
item.setName("Willy Waller");
item.setDescription("For adults only!");
assertTrue("The manufacturer was not persisted", item.getManufacturer() != null);
assertTrue("The manufacturer of the item was incorrect", item.getManufacturer().getName().equals("Mattel Inc."));
Lego lego = new Lego();
lego.setName("The LEGO Group");
item.setManufacturer(lego);
assertTrue("The distributor was not persisted", item.getDistributor() != null);
assertTrue("The distributor of the item was incorrect", item.getDistributor().getName().equals("Namco Games"));
MegaBrands megaBrands = new MegaBrands();
megaBrands.setName("MegaBrands Inc.");
item.setDistributor(megaBrands);
em.merge(item);
em.persist(lego);
em.persist(megaBrands);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
closeEntityManager(em);
}
/**
* Verify the final contents of item.
*/
public void testVerifyItem() {
EntityManager em = createEntityManager();
Item item = em.find(Item.class, itemId);
assertTrue("The manufacturer was not persisted", item.getManufacturer() != null);
assertTrue("The manufacturer of the item was incorrect", item.getManufacturer().getName().equals("The LEGO Group"));
assertTrue("The distributor was not persisted", item.getDistributor() != null);
assertTrue("The distributor of the item was incorrect", item.getDistributor().getName().equals("MegaBrands Inc."));
closeEntityManager(em);
}
public void testInstantiationCopyPolicy(){
assertTrue("The InstantiationCopyPolicy was not properly set.", getServerSession().getDescriptor(Item.class).getCopyPolicy() instanceof InstantiationCopyPolicy);
}
public void testCopyPolicy(){
assertTrue("The CopyPolicy was not properly set.", getServerSession().getDescriptor(Order.class).getCopyPolicy() instanceof TestInstantiationCopyPolicy);
}
public void testCloneCopyPolicy(){
CopyPolicy copyPolicy = getServerSession().getDescriptor(Namco.class).getCopyPolicy();
assertTrue("The CloneCopyPolicy was not properly set.", copyPolicy instanceof CloneCopyPolicy);
assertTrue("The method on CloneCopyPolicy was not properly set.", ((CloneCopyPolicy)copyPolicy).getMethodName().equals("cloneNamco"));
assertTrue("The workingCopyMethod on CloneCopyPolicy was not properly set.", ((CloneCopyPolicy)copyPolicy).getWorkingCopyMethodName().equals("cloneWorkingCopyNamco"));
}
/**
* bug 236275: Use a Collection implementation type that does not implement List in an eager relationship
* This test uses a HashSet
*/
public void testCollectionImplementation(){
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Customer c = new Customer();
//Customer uses HashSet by default, but set it anyway to ensure the model doesn't change.
CustomerCollection collection = new CustomerCollection();
c.setCCustomers(collection);
em.persist(c);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
closeEntityManager(em);
}
// Bug 282571 - Map and ManyToMany
public void testCustomerServiceRepMap(){
EntityManager em = createEntityManager();
beginTransaction(em);
Customer cust = new Customer();
cust.setName("Kovie");
cust.setCity("Ottawa");
CustomerServiceRepresentative rep = new CustomerServiceRepresentative();
rep.setName("Brian");
ServiceCall call = new ServiceCall();
call.setDescription("Trade from Habs.");
cust.addCSInteraction(call, rep);
em.persist(call);
em.persist(cust);
em.flush();
rollbackTransaction(em);
}
/**
* This tests a couple scenarios:
* - 1-M mapped by a M-1 using a JoinTable
* - 1-1 mapped using a JoinTable (uni-directional)
* - 1-1 mapped using a JoinTable (bi-directional)
*/
public void testOne2OneRelationTables() {
EntityManager em = createEntityManager();
beginTransaction(em);
Order order1 = new Order();
Order order2 = new Order();
Auditor auditor = new Auditor();
try {
OrderCard order1Card = new OrderCard();
OrderLabel order1Label = new OrderLabel();
order1Label.setDescription("I describe order 1");
order1.setOrderLabel(order1Label);
order1.setOrderCard(order1Card);
em.persist(order1);
OrderCard order2Card = new OrderCard();
OrderLabel order2Label = new OrderLabel();
order2Label.setDescription("I describe order 2");
order2.setOrderLabel(order2Label);
order2.setOrderCard(order2Card);
em.persist(order2);
auditor.setName("Guillaume");
auditor.addOrder(order1);
auditor.addOrder(order2);
em.persist(auditor);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
Auditor refreshedAuditor = em.find(Auditor.class, auditor.getId());
Order refreshedOrder1 = em.find(Order.class, order1.getOrderId());
Order refreshedOrder2 = em.find(Order.class, order2.getOrderId());
assertTrue("Auditor read back did not match the original", getServerSession().compareObjects(auditor, refreshedAuditor));
assertTrue("Order1 read back did not match the original", getServerSession().compareObjects(order1, refreshedOrder1));
assertTrue("Order2 read back did not match the original", getServerSession().compareObjects(order2, refreshedOrder2));
closeEntityManager(em);
}
/*
* Tests for the executeUpdate method on the EJBQueryImpl class.
* Also tests bugs 4288845 and 4293920, that params are passed in and used correctly.
*/
public void testExecuteUpdateTest() {
EntityManager em = createEntityManager();
Integer[] cusIDs = new Integer[2];
String nameChange1 = "New Name1";
String nameChange2 = "New Name2";
String nameChange3 = "New Name3";
String returnedName1, returnedName2, returnedName3;
Exception expectedException = null;
Exception expectedException2 = null;
try {
Customer cusClone1 = RelationshipsExamples.customerExample1();
beginTransaction(em);
em.persist(cusClone1);
commitTransaction(em);
em.clear();
clearCache();
cusIDs[0] = cusClone1.getCustomerId();
beginTransaction(em);
Customer cus = em.find(Customer.class, cusIDs[0]);
Query query = em.createQuery("UPDATE Customer customer SET customer.name = '" + nameChange1 + "' WHERE customer.customerId = " + cusIDs[0]);
query.executeUpdate();
em.clear();
clearCache();
// getEntityManager().refresh(cus);
cus = em.find(Customer.class, cusIDs[0]);
returnedName1 = cus.getName();
// tests bug 4288845
Query query2 = em.createQuery("UPDATE Customer customer SET customer.name = :name WHERE customer.customerId = " + cusIDs[0]);
query2.setParameter("name", nameChange2);
query2.executeUpdate();
em.clear();
clearCache();
// getEntityManager().refresh(cus);
cus = em.find(Customer.class, cusIDs[0]);
returnedName2 = cus.getName();
// tests bug 4293920
Query query3 = em.createQuery("UPDATE Customer customer SET customer.name = :name WHERE customer.customerId = :id");
query3.setParameter("name", nameChange3);
query3.setParameter("id", cusIDs[0]);
query3.executeUpdate();
em.clear();
clearCache();
// getEntityManager().refresh(cus);
cus = em.find(Customer.class, cusIDs[0]);
returnedName3 = cus.getName();
// tests bug 4294241
try {
Query query4 = em.createNamedQuery("findAllCustomers");
query4.executeUpdate();
} catch (IllegalStateException expected) {
expectedException = expected;
}
expectedException2 = null;
try {
commitTransaction(em);
expectedException2 = null;
} catch (Exception ex) {
expectedException2 = ex;
}
if ((returnedName1 == null || !returnedName1.equals(nameChange1))) {
fail("Customer name did not get updated correctly should be:" + nameChange1 + " is :" + returnedName1);
}
if ((returnedName2 == null || !returnedName2.equals(nameChange2))) {
fail("Customer name did not get updated correctly should be:" + nameChange2 + " is :" + returnedName2);
}
if ((returnedName3 == null || !returnedName3.equals(nameChange3))) {
fail("Customer name did not get updated correctly should be:" + nameChange3 + " is :" + returnedName3);
}
if (expectedException == null) {
fail("excuteUpdate did not result in an exception on findAllCustomers named ReadAllQuery");
}
if (expectedException2 == null) {
fail("commit did not throw expected RollbackException");
}
beginTransaction(em);
Customer cus1 = em.find(Customer.class, cusIDs[0]);
em.remove(cus1);
commitTransaction(em);
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
}
}
/*
* Tests using the 'getResultCollection' api on a Query object obtained from the
* EntityManager Also tests bugs 4300879 - check non Collection container
* policy error and 4297903 - check ReadObjectQuery fails
*/
public void testGetResultCollectionTest() {
Collection returnedCustomers1, returnedCustomers2;
QueryException expectedException1 = null;
String ejbql1 = "SELECT OBJECT(thecust) FROM Customer thecust WHERE thecust.customerId = :id";
Integer[] cusIDs = new Integer[3];
Customer cusClone1 = RelationshipsExamples.customerExample1();
Customer cusClone2 = RelationshipsExamples.customerExample2();
EntityManager em = createEntityManager();
beginTransaction(em);
em.persist(cusClone1);
em.persist(cusClone2);
commitTransaction(em);
em.clear();
clearCache();
cusIDs[0] = cusClone1.getCustomerId();
cusIDs[1] = cusClone2.getCustomerId();
try {
beginTransaction(em);
EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
EJBQueryImpl query1 = (EJBQueryImpl) entityManagerImpl.createNamedQuery("findAllCustomers");
returnedCustomers1 = query1.getResultCollection();
EJBQueryImpl query2 = (EJBQueryImpl) entityManagerImpl.createQuery(ejbql1);
query2.setParameter("id", -10);
returnedCustomers2 = query2.getResultCollection();
// bug:4297903, check container policy failure
EJBQueryImpl query3 = (EJBQueryImpl) entityManagerImpl.createQuery(ejbql1);
ReadAllQuery readAllQuery = new ReadAllQuery(Customer.class);
MapContainerPolicy mapContainerPolicy = new MapContainerPolicy();
mapContainerPolicy.setContainerClass(HashMap.class);
mapContainerPolicy.setKeyName("hashCode");
readAllQuery.setContainerPolicy(mapContainerPolicy);
query3.setDatabaseQuery(readAllQuery);
try {
query3.getResultCollection();
} catch (PersistenceException exc) {// QueryException.INVALID_CONTAINER_CLASS
expectedException1 = (QueryException)exc.getCause();
rollbackTransaction(em);
beginTransaction(em);
}
entityManagerImpl = (EntityManagerImpl) em.getDelegate();
// bug:4300879, check ReadObjectQuery fails
EJBQueryImpl query4 = (EJBQueryImpl) entityManagerImpl.createQuery(ejbql1);
query4.setParameter("id", -10);
ReadObjectQuery readObjectQuery2 = new ReadObjectQuery(Customer.class);
readObjectQuery2.setEJBQLString(ejbql1);
query4.setDatabaseQuery(readObjectQuery2);
query4.getResultCollection();
commitTransaction(em);
if (returnedCustomers1 == null || (returnedCustomers1.size() < 2)) {
fail("Not all customers were returned from findAllCustomers query ");
}
if (returnedCustomers2 == null || (returnedCustomers2.size() != 0)) {
fail("Customer from ReadObjectQuery was not returned using getResultCollection");
}
if (expectedException1 == null || (expectedException1.getErrorCode() != QueryException.INVALID_CONTAINER_CLASS)) {
fail("getResultCollection on query returning a hashtable did not throw expected INVALID_CONTAINER_CLASS QueryException");
}
beginTransaction(em);
Customer cus1 = em.find(Customer.class, cusIDs[0]);
em.remove(cus1);
Customer cus2 = em.find(Customer.class, cusIDs[1]);
em.remove(cus2);
commitTransaction(em);
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
}
}
/*
* Tests using the 'getSingleResult' api on a Query object obtained from the
* EntityManager Also tests bugs 4300879 - check non Collection container
* policy error and 4297903 - check ReadObjectQuery fails
*/
public void testGetResultListTest() {
Collection returnedCustomers1, returnedCustomers2;
QueryException expectedException1 = null;
String ejbql1 = "SELECT OBJECT(thecust) FROM Customer thecust WHERE thecust.customerId = :id";
Integer[] cusIDs = new Integer[3];
Customer cusClone1 = RelationshipsExamples.customerExample1();
Customer cusClone2 = RelationshipsExamples.customerExample2();
EntityManager em = createEntityManager();
beginTransaction(em);
em.persist(cusClone1);
em.persist(cusClone2);
commitTransaction(em);
em.clear();
clearCache();
cusIDs[0] = cusClone1.getCustomerId();
cusIDs[1] = cusClone2.getCustomerId();
try {
beginTransaction(em);
EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
Query query1 = em.createNamedQuery("findAllCustomers");
returnedCustomers1 = query1.getResultList();
Query query2 = em.createQuery(ejbql1);
query2.setParameter("id", -10);
returnedCustomers2 = query2.getResultList();
// bug:4297903, check container policy failure
EJBQueryImpl query3 = (EJBQueryImpl) entityManagerImpl.createQuery(ejbql1);
ReadAllQuery readAllQuery = new ReadAllQuery(Customer.class);
MapContainerPolicy mapContainerPolicy = new MapContainerPolicy();
mapContainerPolicy.setContainerClass(HashMap.class);
mapContainerPolicy.setKeyName("hashCode");
readAllQuery.setContainerPolicy(mapContainerPolicy);
query3.setDatabaseQuery(readAllQuery);
try {
query3.getResultList();
} catch (PersistenceException exc) {// QueryException.INVALID_CONTAINER_CLASS
expectedException1 = (QueryException)exc.getCause();
rollbackTransaction(em);
beginTransaction(em);
}
entityManagerImpl = (EntityManagerImpl) em.getDelegate();
// bug:4300879, check ReadObjectQuery fails
EJBQueryImpl query4 = (EJBQueryImpl) entityManagerImpl.createQuery(ejbql1);
query4.setParameter("id", -10);
ReadObjectQuery readObjectQuery2 = new ReadObjectQuery(Customer.class);
readObjectQuery2.setEJBQLString(ejbql1);
query4.setDatabaseQuery(readObjectQuery2);
query4.getResultList();
commitTransaction(em);
if (returnedCustomers1 == null || (returnedCustomers1.size() < 2)) {
fail("Not all customers were returned from findAllCustomers query ");
}
if (returnedCustomers2 == null || (returnedCustomers2.size() != 0)) {
fail("Customer from ReadObjectQuery was not returned using getResultCollection");
}
if (expectedException1 == null || (expectedException1.getErrorCode() != QueryException.INVALID_CONTAINER_CLASS)) {
fail("getResultCollection on query returning a hashtable did not throw expected INVALID_CONTAINER_CLASS QueryException");
}
beginTransaction(em);
Customer cus1 = em.find(Customer.class, cusIDs[0]);
em.remove(cus1);
Customer cus2 = em.find(Customer.class, cusIDs[1]);
em.remove(cus2);
commitTransaction(em);
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
}
}
/*
* Tests using the 'getSingleResult' api on a Query object obtained from the
* EntityManager Tests fixes for bugs 4202835 and 4301674
*
* modified for changes in bug:4628215 (EntityNotFoundException)
* EntityNotFoundException changed to NoResultException as per new spec
*/
public void testGetSingleResultTest() {
// used for verification
Customer returnedCustomer1, returnedCustomer2 = null;
NonUniqueResultException expectedException1 = null;
NoResultException expectedException2 = null;
String searchString = "notAnItemName";
Integer[] cusIDs = new Integer[3];
Customer cusClone1 = RelationshipsExamples.customerExample1();
Customer cusClone2 = RelationshipsExamples.customerExample2();
EntityManager em = createEntityManager();
try {
beginTransaction(em);
em.persist(cusClone1);
em.persist(cusClone2);
commitTransaction(em);
clearCache();
cusIDs[0] = cusClone1.getCustomerId();
cusIDs[1] = cusClone2.getCustomerId();
beginTransaction(em);
try {
returnedCustomer1 = (Customer) em.createNamedQuery("findAllCustomers").getSingleResult();
} catch (NonUniqueResultException exceptionExpected1) {
expectedException1 = exceptionExpected1;
}
try {
// should be no Items to find, which should cause an
// NoResultException
Query query1 = em.createNamedQuery("findAllItemsByName");
Item item = (Item) query1.setParameter(1, searchString).getSingleResult();
item.toString();
} catch (NoResultException exceptionExpected2) {
expectedException2 = exceptionExpected2;
}
// bug 4301674 test
EJBQueryImpl query2 = (EJBQueryImpl) em.createNamedQuery("findAllCustomers");
ReadAllQuery readAllQuery = new ReadAllQuery(Customer.class);
MapContainerPolicy mapContainerPolicy = new MapContainerPolicy();
mapContainerPolicy.setContainerClass(HashMap.class);
mapContainerPolicy.setKeyName("hashCode");
readAllQuery.setContainerPolicy(mapContainerPolicy);
query2.setDatabaseQuery(readAllQuery);
Map result = (Map) query2.getSingleResult();
result.toString();
// check for single result found.
Query query3 = em.createQuery("SELECT OBJECT(thecust) FROM Customer thecust WHERE thecust.customerId = :id");
returnedCustomer1 = (Customer) query3.setParameter("id", cusIDs[0]).getSingleResult();
// check for single result using a ReadObjectQuery (tests previous
// fix for 4202835)
EJBQueryImpl query4 = (EJBQueryImpl) em.createQuery("SELECT OBJECT(thecust) FROM Customer thecust WHERE thecust.customerId = :id");
query4.setParameter("id", cusIDs[0]);
ReadObjectQuery readObjectQuery = new ReadObjectQuery(Customer.class);
readObjectQuery.setEJBQLString("SELECT OBJECT(thecust) FROM Customer thecust WHERE thecust.customerId = :id");
query4.setDatabaseQuery(readObjectQuery);
returnedCustomer2 = (Customer) query4.getSingleResult();
commitTransaction(em);
beginTransaction(em);
Customer cus1 = em.find(Customer.class, cusIDs[0]);
em.remove(cus1);
Customer cus2 = em.find(Customer.class, cusIDs[1]);
em.remove(cus2);
commitTransaction(em);
if (expectedException1 == null) {
fail("getSingelResult on query returning multiple values did not throw a NonUniqueResultException");
}
if (expectedException2 == null) {
fail("getSingelResult on query returning multiple values did not throw an NoResultException");
}
if (returnedCustomer1 == null || (!returnedCustomer1.getCustomerId().equals(cusIDs[0]))) {
fail("Incorrect Single Customer returned, found: " + returnedCustomer1);
}
if (returnedCustomer2 == null || (!returnedCustomer2.getCustomerId().equals(cusIDs[0]))) {
fail("Incorrect Single Customer returned, found: " + returnedCustomer2);
}
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
}
}
/**
* Tests trying to execute a named query that does not exist.
*
* @author Guy Pelletier
*/
public void testNamedQueryDoesNotExistTest() {
Exception m_exception = null;
boolean m_npeCaught;
boolean m_illegalArgumentExceptionCaught;
EntityManager em = createEntityManager();
m_npeCaught = false;
m_illegalArgumentExceptionCaught = false;
try {
Query query = em.createNamedQuery("doesNotExist");
// Query will just be a wrapper on WLS until the query is run because we are not in a Tx
// workaround that issue
if (getServerSession().getServerPlatform().getClass().getName().contains("WebLogic")){
query.getResultList();
}
} catch (NullPointerException e) {
m_npeCaught = true;
} catch (IllegalArgumentException e) {
m_illegalArgumentExceptionCaught = true;
} catch (Exception e) {
m_exception = e;
}
if (m_npeCaught) {
fail("A null pointer exception caught on the query.");
} else if (!m_illegalArgumentExceptionCaught) {
if (m_exception != null) {
fail("Expected IllegalArgumentException, caught: " + m_exception);
} else {
fail("No exception was caught on a named query that does not exist.");
}
}
}
// Bug#4646580 Query arguments are added in EJBQL
public void testNamedQueryWithArgumentsTest() {
Integer[] cusIDs = new Integer[3];
Integer[] orderIDs = new Integer[3];
Integer[] itemIDs = new Integer[3];
Exception exception = null;
List list = null;
Customer cusClone1 = RelationshipsExamples.customerExample1();
Item item1 = RelationshipsExamples.itemExample1();
Order order1 = RelationshipsExamples.orderExample1();
order1.setCustomer(cusClone1);
order1.setItem(item1);
EntityManager em = createEntityManager();
try {
beginTransaction(em);
em.persist(cusClone1);
em.persist(order1);
commitTransaction(em);
cusIDs[0] = cusClone1.getCustomerId();
orderIDs[0] = order1.getOrderId();
itemIDs[0] = item1.getItemId();
clearCache();
try {
ServerSession ss = getServerSession();
Vector vec = new Vector();
vec.add(itemIDs[0]);
list = (List) ss.executeQuery("findAllOrdersByItem", vec);
} catch (Exception ex) {
exception = ex;
}
beginTransaction(em);
Customer cus1 = em.find(Customer.class, cusIDs[0]);
em.remove(cus1);
Order ord1 = em.find(Order.class, orderIDs[0]);
em.remove(ord1);
Item it1 = em.find(Item.class, itemIDs[0]);
em.remove(it1);
commitTransaction(em);
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
}
if (exception != null) {
fail("An exception is thrown: " + exception);
}
if (list.size() != 1) {
fail("One order is expected but " + list.size() + " was returned");
}
}
// Bug 357103
public void testChangeSetForNewObject(){
EntityManager em = createEntityManager();
beginTransaction(em);
Customer cust = new Customer();
cust.setName("Joe");
em.persist(cust);
Order order = new Order();
order.setQuantity(1);
em.persist(order);
cust.addOrder(order);
commitTransaction(em);
RepeatableWriteUnitOfWork uow = null;
try{
beginTransaction(em);
cust = em.find(Customer.class, cust.getCustomerId());
Order order2 = new Order();
order2.setQuantity(2);
order2.setShippingAddress("123 Main St.");
em.persist(order2);
cust.addOrder(order2);
EntityManagerImpl impl = (EntityManagerImpl)JpaHelper.getEntityManager(em);
uow = impl.getActivePersistenceContext(null);
em.flush();
UnitOfWorkChangeSet uowChangeSet = uow.getCumulativeUOWChangeSet();
ObjectChangeSet customerChangeSet = uowChangeSet.getCloneToObjectChangeSet().get(cust);
CollectionChangeRecord orderChangeRecord = (CollectionChangeRecord)customerChangeSet.getChangesForAttributeNamed("orders");
Iterator<ObjectChangeSet> i = orderChangeRecord.getAddObjectList().keySet().iterator();
while(i.hasNext()){
ObjectChangeSet orderChangeSet = i.next();
assertTrue("There are changes in the change set. There should be no changes for a new object.", orderChangeSet.getChanges().isEmpty());
}
} catch (Exception e){
e.printStackTrace();
} finally{
rollbackTransaction(em);
beginTransaction(em);
cust = em.find(Customer.class, cust.getCustomerId());
em.remove(cust);
commitTransaction(em);
}
}
}