blob: c8ebb8fcbee4ebe9098b4ee1925eee9e00d2d6b3 [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:
// Oracle - initial API and implementation from Oracle TopLink
// 09/23/2008-1.1 Guy Pelletier
// - 241651: JPA 2.0 Access Type support
// 04/02/2009-2.0 Guy Pelletier
// - 270853: testBeerLifeCycleMethodAnnotationIgnored within xml merge testing need to be relocated
package org.eclipse.persistence.testing.tests.jpa.xml.merge.inherited;
import java.sql.Date;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import jakarta.persistence.EntityManager;
import junit.framework.*;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.Alpine;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.BeerConsumer;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.Canadian;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.Certification;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.Beer;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.BeerListener;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.EmbeddedSerialNumber;
import org.eclipse.persistence.testing.models.jpa.xml.merge.inherited.TelephoneNumber;
/**
* JUnit test case(s) for model using a mix of annotations, XML, and XML
* overrides, with entities defined in separate XML mapping files.
*/
public class EntityMappingsMergeInheritedJUnitTestCase extends JUnitTestCase {
private static Integer beerConsumerId;
private static Integer canadianId;
private static Integer alpineId;
private static EmbeddedSerialNumber embeddedSerialNumber;
public EntityMappingsMergeInheritedJUnitTestCase() {
super();
}
public EntityMappingsMergeInheritedJUnitTestCase(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite("Inherited Model");
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testSetup"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testOneToManyRelationships"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testVerifyOneToManyRelationships"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testCreateBeerConsumer"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testReadBeerConsumer"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testNamedNativeQueryBeerConsumers"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testNamedNativeQueryCertifications"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testMappedSuperclassTransientField"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testTransientField"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testUpdateBeerConsumer"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testDeleteBeerConsumer"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testBeerLifeCycleMethodAnnotationIgnored"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testMappedSuperclassEntityListener"));
suite.addTest(new EntityMappingsMergeInheritedJUnitTestCase("testMappedSuperclassEmbeddedXMLElement"));
return suite;
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the server.
*/
public void testSetup() {
DatabaseSession session = JUnitTestCase.getServerSession();
clearCache("ddlGeneration");
}
public void testCreateBeerConsumer() {
EntityManager em = createEntityManager("ddlGeneration");
try {
beginTransaction(em);
BeerConsumer consumer = new BeerConsumer();
consumer.setName("Joe Black");
em.persist(consumer);
beerConsumerId = consumer.getId();
Alpine alpine1 = new Alpine();
alpine1.setAlcoholContent(5.0);
alpine1.setBestBeforeDate(new Date(System.currentTimeMillis()+10000000));
alpine1.setLocalTransientString("This should never be persisted");
em.persist(alpine1);
alpineId=alpine1.getId();
consumer.addAlpineBeerToConsume(alpine1);
embeddedSerialNumber = new EmbeddedSerialNumber();
embeddedSerialNumber.number = 123456;
embeddedSerialNumber.setBreweryCode("MOLSON");
Canadian canadian1 = new Canadian();
canadian1.setAlcoholContent(5.5);
canadian1.setBeerConsumer(consumer);
canadian1.setBornOnDate(new Date(System.currentTimeMillis()-30000000));
canadian1.setTransientString("This should never be persisted");
canadian1.setEmbeddedSerialNumber(embeddedSerialNumber);
em.persist(canadian1);
canadianId=canadian1.getId();
consumer.getCanadianBeersToConsume().put(canadian1.getId(), canadian1);
Canadian canadian2 = new Canadian();
canadian2.setAlcoholContent(5.0);
canadian2.setBeerConsumer(consumer);
canadian2.setBornOnDate(new Date(System.currentTimeMillis()-23000000));
em.persist(canadian2);
consumer.getCanadianBeersToConsume().put(canadian2.getId(), canadian2);
Certification cert1 = new Certification();
cert1.setDescription("Value brand beer consumption certified");
cert1.setBeerConsumer(consumer);
em.persist(cert1);
consumer.getCertifications().put(cert1.getId(), cert1);
Certification cert2 = new Certification();
cert2.setDescription("Premium brand beer consumption certified");
cert2.setBeerConsumer(consumer);
em.persist(cert2);
consumer.getCertifications().put(cert2.getId(), cert2);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
throw e;
}
}
public void testNamedNativeQueryBeerConsumers() {
List consumers = createEntityManager("ddlGeneration").createNamedQuery("findAnyMergeSQLBeerConsumer").getResultList();
assertTrue("Error executing native query 'findAnyMergeSQLBeerConsumer'", consumers != null);
}
public void testNamedNativeQueryCertifications() {
List certifications = createEntityManager("ddlGeneration").createNamedQuery("findAllMergeSQLCertifications").getResultList();
assertTrue("Error executing native query 'findAllMergeSQLCertifications'", certifications != null);
}
public void testDeleteBeerConsumer() {
EntityManager em = createEntityManager("ddlGeneration");
beginTransaction(em);
try{
em.remove(em.find(BeerConsumer.class, beerConsumerId));
commitTransaction(em);
}catch (RuntimeException ex){
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw ex;
}
assertTrue("Error deleting BeerConsumer", em.find(BeerConsumer.class, beerConsumerId) == null);
}
public void testReadBeerConsumer() {
BeerConsumer consumer = createEntityManager("ddlGeneration").find(BeerConsumer.class, beerConsumerId);
assertTrue("Error reading BeerConsumer", consumer.getId() == beerConsumerId);
}
public void testUpdateBeerConsumer() {
EntityManager em = createEntityManager("ddlGeneration");
beginTransaction(em);
try{
BeerConsumer beerConsumer = em.find(BeerConsumer.class, beerConsumerId);
beerConsumer.setName("Joe White");
commitTransaction(em);
}catch (RuntimeException ex){
if (isTransactionActive(em)){
rollbackTransaction(em);
}
throw ex;
}
clearCache("ddlGeneration");
BeerConsumer newBeerConsumer = em.find(BeerConsumer.class, beerConsumerId);
closeEntityManager(em);
assertTrue("Error updating BeerConsumer name", newBeerConsumer.getName().equals("Joe White"));
}
/**
* Merge Test:Have a class(TelephoneNumber) that uses a composite primary
* key (defined partially in annotations and XML) and define a 1-M
* (BeerConsumer-{@literal >}TelephoneNumber) for it in XML
*/
public void testOneToManyRelationships() {
EntityManager em = createEntityManager("ddlGeneration");
try {
beginTransaction(em);
BeerConsumer consumer = new BeerConsumer();
consumer.setName("Joe Black");
TelephoneNumber homeNumber = new TelephoneNumber();
homeNumber.setAreaCode("555");
homeNumber.setType("Home");
homeNumber.setNumber("123-1234");
TelephoneNumber workNumber = new TelephoneNumber();
workNumber.setAreaCode("555");
workNumber.setType("Work");
workNumber.setNumber("987-9876");
consumer.addTelephoneNumber(homeNumber);
consumer.addTelephoneNumber(workNumber);
em.persist(consumer);
beerConsumerId = consumer.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
throw e;
}
}
//Verify Relationship
public void testVerifyOneToManyRelationships() {
EntityManager em = createEntityManager("ddlGeneration");
try {
beginTransaction(em);
BeerConsumer cm = em.find(BeerConsumer.class, beerConsumerId);
Collection<TelephoneNumber> phones = cm.getTelephoneNumbers().values();
assertTrue("Wrong phonenumbers associated with BeerConsumer", phones.size() == 2);
for (Iterator<TelephoneNumber> iterator = phones.iterator(); iterator.hasNext();){
TelephoneNumber phone = iterator.next();
assertTrue("Wrong owner of the telephone",phone.getBeerConsumer().getId() == beerConsumerId);
}
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
throw e;
}
}
// Verify transient property from mapped superclass is not persisted
public void testMappedSuperclassTransientField() {
clearCache("ddlGeneration");
Canadian canadianBeer = createEntityManager("ddlGeneration").find(Canadian.class, canadianId);
assertTrue("Error reading Canadian", canadianBeer.getId().equals(canadianId));
assertTrue("Mapped superclass transientString was persisted to the database", canadianBeer.getTransientString() == null);
}
// Verify transient property is not persisted
public void testTransientField() {
clearCache("ddlGeneration");
Alpine alpineBeer = createEntityManager("ddlGeneration").find(Alpine.class, alpineId);
assertTrue("Error reading Alpine", alpineBeer.getId().equals(alpineId));
assertTrue("localTransientString was persisted to the database", alpineBeer.getLocalTransientString() == null);
}
public void testBeerLifeCycleMethodAnnotationIgnored() {
// Since metadata-complete specified on Beer superclass, all annotations
// including lifecycle methods should be ignored.
int beerPrePersistCount = Beer.BEER_PRE_PERSIST_COUNT;
EntityManager em = createEntityManager("ddlGeneration");
BeerConsumer consumer = createEntityManager("ddlGeneration").find(BeerConsumer.class, beerConsumerId);
try {
beginTransaction(em);
Canadian canadian1 = new Canadian();
canadian1.setAlcoholContent(5.5);
canadian1.setBeerConsumer(consumer);
canadian1.setBornOnDate(new Date(System.currentTimeMillis()-30000000));
em.persist(canadian1);
commitTransaction(em);
} catch (RuntimeException ex) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw ex;
}
assertTrue("The callback method [PrePersist] was called.", beerPrePersistCount == Beer.BEER_PRE_PERSIST_COUNT);
}
public void testMappedSuperclassEntityListener() {
int listenerPostPersistCount = BeerListener.POST_PERSIST_COUNT;
EntityManager em = createEntityManager("ddlGeneration");
BeerConsumer consumer = createEntityManager("ddlGeneration").find(BeerConsumer.class, beerConsumerId);
try {
beginTransaction(em);
Canadian canadian1 = new Canadian();
canadian1.setAlcoholContent(5.5);
canadian1.setBeerConsumer(consumer);
canadian1.setBornOnDate(new Date(System.currentTimeMillis()-30000000));
em.persist(canadian1);
commitTransaction(em);
} catch (RuntimeException ex) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw ex;
}
assertFalse("The listener callback method [PostPersist] was not called.", listenerPostPersistCount == BeerListener.POST_PERSIST_COUNT);
}
public void testMappedSuperclassEmbeddedXMLElement() {
/**
* Canadian canadianBeer = (Canadian) createEntityManager("ddlGeneration").find(Canadian.class, canadianId);
* assertTrue("Error reading Canadian", canadianBeer.getId() == canadianId);
* assertTrue("Mapped superclass embedded element was not processed correctly", (canadianBeer.getEmbeddedSerialNumber().getNumber() == embeddedSerialNumber.getNumber())
* &&(canadianBeer.getEmbeddedSerialNumber().getBreweryCode().equals(embeddedSerialNumber.getBreweryCode())));
*/
}
}