blob: 69ee7cc1a8df66484b58332fa6d4f5b96212f76f [file] [log] [blame]
/*
* Copyright (c) 2007, 2020 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:
// Oracle - Initial API and implementation.
// 07/07/2014-2.6 Tomas Kraus
// - 439127: Modified as jUnit test.
// 03/19/2018-2.7.2 Lukas Jungmann
// - 413120: Nested Embeddable Null pointer
// - 496836: NullPointerException on ObjectChangeSet.mergeObjectChanges
package org.eclipse.persistence.testing.tests.jpa.advanced;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import jakarta.persistence.EntityManager;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.AdvancedTableCreator;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
import org.eclipse.persistence.testing.models.jpa.advanced.embeddable.Continent;
import org.eclipse.persistence.testing.models.jpa.advanced.embeddable.Country;
import org.eclipse.persistence.testing.models.jpa.advanced.embeddable.Description;
import org.eclipse.persistence.testing.models.jpa.advanced.embeddable.Visitor;
import org.eclipse.persistence.testing.models.jpa.advanced.embeddable.VisitorPopulator;
public class EntityEmbeddableTest extends JUnitTestCase {
/** Persistence unit name. */
protected String PUName = "embeddable";
/**
* Constructs an instance of <code>EntityEmbeddableTest</code> class.
*/
public EntityEmbeddableTest() {
super();
setPuName(PUName);
}
/**
* Constructs an instance of <code>EntityEmbeddableTest</code> class with given test case name.
* @param name Test case name.
*/
public EntityEmbeddableTest(String name) {
super(name);
setPuName(PUName);
}
/**
* Build collection of test cases for this jUnit test instance.
* @return {@link Test} class containing collection of test cases for this jUnit test instance.
*/
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new EntityEmbeddableTest("testSetup"));
return addEntityEmbeddableTest(suite);
}
/**
* Adds test, similar to suite() but without adding a setup. Used from <code>suite()</code> to add individual tests.
* @param suite Target {@link TestSuite} class where to store tests.
* @return {@link Test} class containing collection of test cases for this jUnit test instance.
*/
public static Test addEntityEmbeddableTest(TestSuite suite){
suite.setName("EntityEmbeddableTest");
suite.addTest(new EntityEmbeddableTest("testNativeQueryWithSqlResultSetMappings"));
suite.addTest(new EntityEmbeddableTest("testRootEmbeddable"));
suite.addTest(new EntityEmbeddableTest("testNestedEmbeddable"));
suite.addTest(new EntityEmbeddableTest("testMixedEmbeddable"));
return suite;
}
/**
* Initial setup is done as first test in collection, both to record its failure, and to allow execution in the server.
*/
public void testSetup() {
System.out.println("testSetup");
new AdvancedTableCreator().replaceTables(getServerSession(PUName));
clearCache(PUName);
}
/**
* Initialize, persist and retrieve some <code>Visitor</code> entities for testing.
* @param em An <code>EntityManager</code> instance used to persist sample data.
* @return Collection of initialized and persisted <code>Visitor</code> entities.
*/
private Collection<Visitor> createVisitorEntities(EntityManager em) {
Collection<Visitor> visitors = new LinkedList<Visitor>();
beginTransaction(em);
try {
Visitor v1 = VisitorPopulator.visitorExample1();
Visitor v2 = VisitorPopulator.visitorExample2();
em.persist(v1);
em.persist(v2);
visitors.add(v1);
visitors.add(v2);
} catch (RuntimeException ex) {
rollbackTransaction(em);
throw ex;
}
em.flush();
commitTransaction(em);
return visitors;
}
/**
* Delete provided <code>Visitor</code> entities.
* @param em An <code>EntityManager</code> instance used to delete sample data.
* @param visitors Collection of <code>Visitor</code> entities to be deleted.
*/
private void deleteVisitorEntities(EntityManager em, Collection<Visitor> visitors) {
beginTransaction(em);
try {
for (Visitor visitor : visitors) {
em.remove(visitor);
}
} catch (RuntimeException ex) {
rollbackTransaction(em);
throw ex;
}
em.flush();
commitTransaction(em);
}
/**
* Test native SQL query that returns result as object defined in <code>SqlResultSetMapping</code> annotation.
*/
public void testNativeQueryWithSqlResultSetMappings() {
List q;
int passCounter = 0;
EntityManager em = createEntityManager(PUName);
Collection<Visitor> visitors = null;
try {
visitors = createVisitorEntities(em);
q = em.createNativeQuery(
"Select o.ID AS OID, o.NAME AS ONAME, o.COUNTRY AS OCOUNTRY, " +
"o.CODE AS OCODE from CMP3_EMBED_VISITOR o WHERE (o.ID = '1')", "VisitorResults")
.getResultList();
assertEquals("Size of returned list with query results should be 1.", q.size(), 1);
for (Object obj : q) {
if (obj instanceof Visitor) {
Visitor custReturned = (Visitor) obj;
assertTrue("Visitor object primary key is invalid.", "1".equals(custReturned.getId()));
assertTrue("Country code is invalid.", "USA".equals(custReturned.getCountry().getCode()));
} else {
fail("Received unexpected instance: " + obj != null ? obj.getClass().getName() : "null");
}
}
} catch (Exception e) {
fail("Unexpected exception occurred: " + e.getMessage());
} finally {
if (visitors != null) {
deleteVisitorEntities(em, visitors);
em.close();
}
}
}
public void testRootEmbeddable() {
EntityManager em = createEntityManager(PUName);
beginTransaction(em);
Visitor v = null;
try {
v = VisitorPopulator.visitorExample3();
em.persist(v);
em.flush();
commitTransaction(em);
} catch (RuntimeException ex) {
rollbackTransaction(em);
throw ex;
}
beginTransaction(em);
try {
v.setName("fixed name");
em.merge(v);
em.flush();
v.setCountry(null);
em.merge(v);
em.flush();
v.setCountry(new Country("HU", "Hungary", "EUR"));
v.getCountry().setCode("OTH");
em.merge(v);
em.flush();
v.getCountry().setCode(null);
em.merge(v);
em.flush();
} finally {
closeEntityManagerAndTransaction(em);
}
}
public void testNestedEmbeddable() {
EntityManager em = createEntityManager(PUName);
beginTransaction(em);
Visitor v = null;
try {
v = VisitorPopulator.visitorExample4();
em.persist(v);
em.flush();
v.getCountry().setContinent(null);
em.merge(v);
em.flush();
Continent c = new Continent("Africa");
v.getCountry().setContinent(c);
em.merge(v);
em.flush();
v.getCountry().setContinent(new Continent("AFR"));
em.merge(v);
em.flush();
v.getCountry().setContinent(null);
em.merge(v);
em.flush();
} finally {
closeEntityManagerAndTransaction(em);
}
}
public void testMixedEmbeddable() {
EntityManager em = createEntityManager(PUName);
beginTransaction(em);
Visitor v = null;
try {
v = VisitorPopulator.visitorExample5();
em.persist(v);
em.flush();
commitTransaction(em);
} catch (RuntimeException ex) {
rollbackTransaction(em);
throw ex;
}
beginTransaction(em);
try {
v.getCountry().getContinent().setDescription(null);
em.merge(v);
em.flush();
v.getCountry().setContinent(null);
em.merge(v);
em.flush();
v.setCountry(null);
em.merge(v);
em.flush();
v.setCountry(new Country("JAR", "South Africa", "EUR"));
Continent c = new Continent("Africa");
v.getCountry().setContinent(c);
em.merge(v);
em.flush();
v.getCountry().getContinent().setContinentCode("AFR");
em.merge(v);
em.flush();
v.getCountry().getContinent().setDescription(new Description("Africa is nice continent"));
em.merge(v);
em.flush();
v.getCountry().getContinent().setDescription(null);
em.merge(v);
em.flush();
v.getCountry().setContinent(null);
em.merge(v);
em.flush();
v.setCountry(null);
em.merge(v);
em.flush();
v.setCountry(new Country("ALB", "ALBANIA", "EUR"));
v.getCountry().getContinent().setDescription(new Description("Small continent"));
em.merge(v);
em.flush();
} finally {
closeEntityManagerAndTransaction(em);
}
}
}