blob: 3d40f2d58b746429dad3e7603fd3bcf2c2ac53ab [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
// 06/20/2008-1.0 Guy Pelletier
// - 232975: Failure when attribute type is generic
// 09/23/2008-1.1 Guy Pelletier
// - 241651: JPA 2.0 Access Type support
// 01/28/2009-2.0 Guy Pelletier
// - 248293: JPA 2.0 Element Collections (part 1)
// 02/06/2009-2.0 Guy Pelletier
// - 248293: JPA 2.0 Element Collections (part 2)
// 03/27/2009-2.0 Guy Pelletier
// - 241413: JPA 2.0 Add EclipseLink support for Map type attributes
// 04/03/2009-2.0 Guy Pelletier
// - 241413: JPA 2.0 Add EclipseLink support for Map type attributes
// 06/02/2009-2.0 Guy Pelletier
// - 278768: JPA 2.0 Association Override Join Table
// 06/09/2009-2.0 Guy Pelletier
// - 249037: JPA 2.0 persisting list item index
// 02/18/2010-2.0.2 Guy Pelletier
// - 294803: @Column(updatable=false) has no effect on @Basic mappings
// 06/18/2010-2.2 Guy Pelletier
// - 300458: EclispeLink should throw a more specific exception than NPE
// 07/16/2010-2.2 Guy Pelletier
// - 260296: mixed access with no Transient annotation does not result in error
package org.eclipse.persistence.testing.tests.jpa.inherited;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import junit.framework.*;
import org.eclipse.persistence.exceptions.QueryException;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.internal.weaving.PersistenceWeaved;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.sessions.CopyGroup;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.inherited.Accredidation;
import org.eclipse.persistence.testing.models.jpa.inherited.Becks;
import org.eclipse.persistence.testing.models.jpa.inherited.BecksTag;
import org.eclipse.persistence.testing.models.jpa.inherited.BeerConsumer;
import org.eclipse.persistence.testing.models.jpa.inherited.Birthday;
import org.eclipse.persistence.testing.models.jpa.inherited.Blue;
import org.eclipse.persistence.testing.models.jpa.inherited.Alpine;
import org.eclipse.persistence.testing.models.jpa.inherited.BlueLight;
import org.eclipse.persistence.testing.models.jpa.inherited.Bluish;
import org.eclipse.persistence.testing.models.jpa.inherited.BuildingBylaw;
import org.eclipse.persistence.testing.models.jpa.inherited.Committee;
import org.eclipse.persistence.testing.models.jpa.inherited.CommitteeDates;
import org.eclipse.persistence.testing.models.jpa.inherited.Corona;
import org.eclipse.persistence.testing.models.jpa.inherited.CoronaTag;
import org.eclipse.persistence.testing.models.jpa.inherited.ExpertBeerConsumer;
import org.eclipse.persistence.testing.models.jpa.inherited.Heineken;
import org.eclipse.persistence.testing.models.jpa.inherited.InheritedTableManager;
import org.eclipse.persistence.testing.models.jpa.inherited.Location;
import org.eclipse.persistence.testing.models.jpa.inherited.NodeImpl;
import org.eclipse.persistence.testing.models.jpa.inherited.NoiseBylaw;
import org.eclipse.persistence.testing.models.jpa.inherited.NoviceBeerConsumer;
import org.eclipse.persistence.testing.models.jpa.inherited.Official;
import org.eclipse.persistence.testing.models.jpa.inherited.OfficialEntry;
import org.eclipse.persistence.testing.models.jpa.inherited.Record;
import org.eclipse.persistence.testing.models.jpa.inherited.RedStripe;
import org.eclipse.persistence.testing.models.jpa.inherited.SerialNumber;
import org.eclipse.persistence.testing.models.jpa.inherited.Venue;
import org.eclipse.persistence.testing.models.jpa.inherited.Witness;
import org.eclipse.persistence.testing.models.jpa.inherited.ServiceTime;
public class InheritedModelJunitTest extends JUnitTestCase {
private static BigDecimal m_blueId;
private static Integer m_beerConsumerId;
private static Integer m_noviceBeerConsumerId;
private static Integer m_expertBeerConsumerId;
private static Timestamp m_quote1Stamp;
private static final String QUOTE_ONE = "Beer is blood";
private static Timestamp m_quote2Stamp;
private static final String QUOTE_TWO = "My first wife was a beer";
public InheritedModelJunitTest() {
super();
}
public InheritedModelJunitTest(String name) {
super(name);
}
@Override
public void setUp() {
super.setUp();
clearCache();
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("InheritedModelJunitTest");
suite.addTest(new InheritedModelJunitTest("testSetup"));
suite.addTest(new InheritedModelJunitTest("testCreateBlue"));
suite.addTest(new InheritedModelJunitTest("testReadBlue"));
suite.addTest(new InheritedModelJunitTest("testCreateBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testCreateNoviceBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testReadNoviceBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testOrderColumnNoviceBeerConsumerDesignations"));
suite.addTest(new InheritedModelJunitTest("testCreateExpertBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testDeleteMiddleRecordOfExpertBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testReadExpertBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testExpertBeerConsumerRecordsCRUD"));
suite.addTest(new InheritedModelJunitTest("testUpdateBeerConsumer"));
suite.addTest(new InheritedModelJunitTest("testInheritedClone"));
suite.addTest(new InheritedModelJunitTest("testCascadeRemove"));
// 1-M map using direct key
suite.addTest(new InheritedModelJunitTest("testHeinekenBeerConsumer"));
// 1-M map using entity key
suite.addTest(new InheritedModelJunitTest("testBecksBeerConsumer"));
// 1-M map using embeddable key
suite.addTest(new InheritedModelJunitTest("testCoronaBeerConsumer"));
// Element collection with generic map key type, with embeddable values.
suite.addTest(new InheritedModelJunitTest("testRedStripeExpertConsumer"));
// Element collection with generic map key type, with embeddable values.
suite.addTest(new InheritedModelJunitTest("testRedStripeNoviceConsumer"));
// OrderColumn with OrderCorrectionType.EXCEPTION
suite.addTest(new InheritedModelJunitTest("testBreakOrder_CorrectionType_EXCEPTION"));
// OrderColumn with OrderCorrectionType.READ_WRITE
suite.addTest(new InheritedModelJunitTest("testBreakOrder_CorrectionType_READ_WRITE"));
suite.addTest(new InheritedModelJunitTest("testMapOrphanRemoval"));
suite.addTest(new InheritedModelJunitTest("testSerializedElementCollectionMap"));
suite.addTest(new InheritedModelJunitTest("testVersionUpdateOnElementCollectionChange"));
suite.addTest(new InheritedModelJunitTest("testAddToHeinekenBeerConsumerMap"));
suite.addTest(new InheritedModelJunitTest("testColumnUpdatableAndInsertable"));
suite.addTest(new InheritedModelJunitTest("testColumnUpdatableAndInsertableThroughQuery"));
suite.addTest(new InheritedModelJunitTest("testElementCollectionMapEmbeddable"));
suite.addTest(new InheritedModelJunitTest("testMultipleIdButNonIdClassEntity"));
suite.addTest(new InheritedModelJunitTest("testRelatedBylawWrite"));
suite.addTest(new InheritedModelJunitTest("testInterfaceBylawWrite"));
suite.addTest(new InheritedModelJunitTest("testEmbeddableAggregateCollectionAndAggregate"));
suite.addTest(new InheritedModelJunitTest("testNodeImplWeaving"));
suite.addTest(new InheritedModelJunitTest("testEmbeddaleCollectionMapEmbeddableRead"));
suite.addTest(new InheritedModelJunitTest("testCopyMapKeyMap"));
if (!isJPA10()) {
suite.addTest(new InheritedModelJunitTest("testInterfaces"));
}
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 InheritedTableManager().replaceTables(JUnitTestCase.getServerSession());
clearCache();
}
public void testMultipleIdButNonIdClassEntity() {
EntityManager em = createEntityManager();
beginTransaction(em);
NoiseBylaw noiseBylaw = new NoiseBylaw();
int noiseBylawId = 0;
BuildingBylaw buildingBylaw = new BuildingBylaw();
int buildingBylawId = 0;
try {
noiseBylaw.setCity("Ottawa");
noiseBylaw.setDescription("Can't mow your grass after 9PM!");
em.persist(noiseBylaw);
buildingBylaw.setCity("Ottawa");
buildingBylaw.setDescription("Can't build without a permit");
em.persist(buildingBylaw);
noiseBylawId = noiseBylaw.getNumber();
buildingBylawId = buildingBylaw.getNumber();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
// find by object entity will not work since there is no IdClass in
// this case so we will look it up through jpql
String jpqlString = "SELECT n FROM NoiseBylaw n WHERE n.number =" + noiseBylawId;
NoiseBylaw refreshedNoiseBylaw = (NoiseBylaw) em.createQuery(jpqlString).getSingleResult();
assertTrue("The noise bylaw read back did not match the original", getServerSession().compareObjects(noiseBylaw, refreshedNoiseBylaw));
String jpqlString2 = "SELECT n FROM BuildingBylaw n WHERE n.number =" + buildingBylawId;
BuildingBylaw refreshedBuildingBylaw = (BuildingBylaw) em.createQuery(jpqlString2).getSingleResult();
assertTrue("The building bylaw read back did not match the original", getServerSession().compareObjects(buildingBylaw, refreshedBuildingBylaw));
closeEntityManager(em);
}
public void testBecksBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
BeerConsumer initialBC = new BeerConsumer();
int beerConsumerId = 0;
try {
Becks becks1 = new Becks();
becks1.setAlcoholContent(5.1);
BecksTag becksTag1 = new BecksTag();
becksTag1.setCallNumber("0A.789");
em.persist(becksTag1);
Becks becks2 = new Becks();
becks2.setAlcoholContent(5.1);
BecksTag becksTag2 = new BecksTag();
becksTag2.setCallNumber("BX.521");
em.persist(becksTag2);
Becks becks3 = new Becks();
becks3.setAlcoholContent(5.1);
BecksTag becksTag3 = new BecksTag();
becksTag3.setCallNumber("UY.429");
em.persist(becksTag3);
initialBC.setName("Becks Consumer");
initialBC.addBecksBeerToConsume(becks1, becksTag1);
initialBC.addBecksBeerToConsume(becks2, becksTag2);
initialBC.addBecksBeerToConsume(becks3, becksTag3);
em.persist(initialBC);
beerConsumerId = initialBC.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, beerConsumerId);
assertTrue("The beer consumer read back did not match the original", getServerSession().compareObjects(initialBC, refreshedBC));
}
public void testCoronaBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
BeerConsumer initialBC = new BeerConsumer();
int beerConsumerId = 0;
try {
Corona corona1 = new Corona();
corona1.setAlcoholContent(5.3);
CoronaTag coronaTag1 = new CoronaTag();
coronaTag1.setCode("0A");
coronaTag1.setNumber(789);
Corona corona2 = new Corona();
corona2.setAlcoholContent(5.3);
CoronaTag coronaTag2 = new CoronaTag();
coronaTag2.setCode("BX");
coronaTag2.setNumber(521);
Corona corona3 = new Corona();
corona3.setAlcoholContent(5.3);
CoronaTag coronaTag3 = new CoronaTag();
coronaTag3.setCode("UY");
coronaTag3.setNumber(429);
initialBC.setName("Corona Consumer");
initialBC.addCoronaBeerToConsume(corona1, coronaTag1);
initialBC.addCoronaBeerToConsume(corona2, coronaTag2);
initialBC.addCoronaBeerToConsume(corona3, coronaTag3);
em.persist(initialBC);
beerConsumerId = initialBC.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, beerConsumerId);
assertTrue("The beer consumer read back did not match the original", getServerSession().compareObjects(initialBC, refreshedBC));
}
public void testCreateBlue() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Blue blue = new Blue();
blue.setAlcoholContent(5.3f);
em.persist(blue);
m_blueId = blue.getId();
blue.setUniqueKey(m_blueId.toBigInteger());
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
closeEntityManager(em);
}
public void testOrderColumnNoviceBeerConsumerDesignations() {
EntityManager em = createEntityManager();
beginTransaction(em);
NoviceBeerConsumer beerConsumer;
try {
// These are the designations we have right now ...
// index: 0 - 1 - 2 - 3 - 4
// item: 5 - 4 - 2 - 3 - 1
beerConsumer = em.find(NoviceBeerConsumer.class, m_noviceBeerConsumerId);
//String stringFour = beerConsumer.getDesignations().remove(1);
//String stringTwo = beerConsumer.getDesignations().remove(1);
//beerConsumer.getDesignations().add(stringTwo);
// This is what we have done
// index: 0 - 1 - 2 - 3
// item: 5 - 3 - 1 - 2
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, m_noviceBeerConsumerId);
assertTrue("The novice beer consumer read back did not match the original", getServerSession().compareObjects(beerConsumer, refreshedBC));
}
public void testReadBlue() {
Blue blue = createEntityManager().find(Blue.class, m_blueId);
assertTrue("Error on reading back a Blue beer", blue != null);
}
public void testCreateBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
BeerConsumer beerConsumer = new BeerConsumer();
beerConsumer.setName("Blue Consumer");
em.persist(beerConsumer);
m_beerConsumerId = beerConsumer.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
}
public void testCreateNoviceBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
NoviceBeerConsumer beerConsumer = new NoviceBeerConsumer();
try {
beerConsumer.setName("Novice Beer Consumer");
beerConsumer.setIQ(100);
beerConsumer.getAcclaims().add(1);
beerConsumer.getAcclaims().add(2);
beerConsumer.getAcclaims().add(3);
beerConsumer.getAwards().put(1, 1);
beerConsumer.getAwards().put(2, 2);
beerConsumer.getAwards().put(3, 3);
beerConsumer.getDesignations().add("5");
beerConsumer.getDesignations().add("4");
beerConsumer.getDesignations().add("2");
beerConsumer.getDesignations().add("3");
beerConsumer.getDesignations().add("1");
Record record1 = new Record();
record1.setDescription("Slowest beer ever consumed - 10 hours");
record1.setDate(Helper.dateFromYearMonthDate(2008, 1, 1));
record1.setLocation(new Location("Paris", "France"));
Venue venue1 = new Venue();
venue1.setAttendance(10);
venue1.setName("Champs-Elysees");
record1.setVenue(venue1);
beerConsumer.getRecords().add(record1);
Accredidation accredidation = new Accredidation();
accredidation.setDetails("Superb, just superb!");
Witness witness1 = new Witness();
witness1.setName("Mickey Blue Eyes");
accredidation.addWitness(witness1);
Witness witness2 = new Witness();
witness2.setName("Donny Trafalgo");
accredidation.addWitness(witness2);
beerConsumer.setAccredidation(accredidation);
Committee committee1 = new Committee();
committee1.setDescription("Moral labelling");
beerConsumer.addCommittee(committee1);
Committee committee2 = new Committee();
committee2.setDescription("Crimes against beer");
beerConsumer.addCommittee(committee2);
Committee committee3 = new Committee();
committee3.setDescription("BADD - Beers against drunk dorks");
beerConsumer.addCommittee(committee3);
em.persist(beerConsumer);
m_noviceBeerConsumerId = beerConsumer.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation for a novice beer consumer: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, m_noviceBeerConsumerId);
assertTrue("The novice beer consumer read back did not match the original", getServerSession().compareObjects(beerConsumer, refreshedBC));
}
public void testCreateExpertBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
ExpertBeerConsumer beerConsumer = new ExpertBeerConsumer();
try {
beerConsumer.setName("Expert Beer Consumer");
beerConsumer.setIQ(110);
beerConsumer.getAcclaims().add("A");
beerConsumer.getAcclaims().add("B");
beerConsumer.getAcclaims().add("C");
// Commenting out this mapping until bug 272298 is resolved.
// The compareObjects check below would fail in some configurations
// as a result of this.
//beerConsumer.getAudio().add(new byte[]{1});
//beerConsumer.getAudio().add(new byte[]{2});
//beerConsumer.getAudio().add(new byte[]{3});
beerConsumer.getAwards().put("A", "A");
beerConsumer.getAwards().put("B", "B");
beerConsumer.getAwards().put("C", "C");
beerConsumer.getDesignations().add("A");
beerConsumer.getDesignations().add("B");
m_quote1Stamp = Helper.timestampFromDate(Helper.dateFromYearMonthDate(2009, 1, 1));
beerConsumer.getQuotes().put(m_quote1Stamp, QUOTE_ONE);
m_quote2Stamp = Helper.timestampFromDate(Helper.dateFromYearMonthDate(2005, 7, 9));
beerConsumer.getQuotes().put(m_quote2Stamp, QUOTE_TWO);
Record record1 = new Record();
record1.setDescription("Fastest beer ever consumed - 10 ms");
record1.setDate(Helper.dateFromYearMonthDate(2009, 10, 10));
record1.setLocation(new Location("Ottawa", "Canada"));
Venue venue1 = new Venue();
venue1.setAttendance(10000);
venue1.setName("Scotiabank PLace");
record1.setVenue(venue1);
beerConsumer.getRecords().add(record1);
Record record2 = new Record();
record2.setDescription("Most beers consumed upside down - 12");
record2.setDate(Helper.dateFromYearMonthDate(2007, 11, 11));
record2.setLocation(new Location("Sydney", "Australia"));
Venue venue2 = new Venue();
venue2.setAttendance(2678);
venue2.setName("Opera House");
record2.setVenue(venue2);
beerConsumer.getRecords().add(record2);
Record record3 = new Record();
record3.setDescription("Most beers consumed in a second - 5");
record3.setDate(Helper.dateFromYearMonthDate(2005, 12, 12));
record3.setLocation(new Location("Miami", "USA"));
Venue venue3 = new Venue();
venue3.setAttendance(63000);
venue3.setName("Dolphin Stadium");
record3.setVenue(venue3);
beerConsumer.getRecords().add(record3);
Accredidation accredidation = new Accredidation();
accredidation.setDetails("Elite, absolutely elite!");
Witness witness1 = new Witness();
witness1.setName("Big Bobby");
accredidation.addWitness(witness1);
Witness witness2 = new Witness();
witness2.setName("Little Bobby");
accredidation.addWitness(witness2);
Official official = new Official();
official.setName("Authority Joe");
accredidation.addOfficial(official);
beerConsumer.setAccredidation(accredidation);
Birthday birthday1 = new Birthday();
birthday1.setDay(9);
birthday1.setMonth(7);
birthday1.setYear(2005);
beerConsumer.addCelebration(birthday1, "Drank a 24 of Heineken");
Birthday birthday2 = new Birthday();
birthday2.setDay(10);
birthday2.setMonth(7);
birthday2.setYear(2006);
beerConsumer.addCelebration(birthday2, "Drank a 24 of Becks");
Committee committee1 = new Committee();
committee1.setDescription("New beer committee");
CommitteeDates committee1Dates = new CommitteeDates();
committee1Dates.setStartDate("Jan 1, 2010");
committee1.setCommitteeDates(committee1Dates);
beerConsumer.addCommittee(committee1);
Committee committee2 = new Committee();
committee2.setDescription("Alcohol content regulation");
CommitteeDates committee2Dates = new CommitteeDates();
committee2Dates.setStartDate("Jan 1, 1970");
committee2Dates.setEndDate("Jan 1, 2001");
committee2.setCommitteeDates(committee2Dates);
beerConsumer.addCommittee(committee2);
em.persist(beerConsumer);
m_expertBeerConsumerId = beerConsumer.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation for an expert beer consumer: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, m_expertBeerConsumerId);
assertTrue("The expert beer consumer read back did not match the original", getServerSession().compareObjects(beerConsumer, refreshedBC));
}
public void testDeleteMiddleRecordOfExpertBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
ExpertBeerConsumer beerConsumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
beerConsumer.getRecords().remove(1);
commitTransaction(em);
} finally {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
clearCache();
}
}
public void testHeinekenBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
BeerConsumer initialBC = new BeerConsumer();
int beerConsumerId = 0;
try {
Heineken heineken1 = new Heineken();
heineken1.setAlcoholContent(5.0);
Heineken heineken2 = new Heineken();
heineken2.setAlcoholContent(5.0);
Heineken heineken3 = new Heineken();
heineken3.setAlcoholContent(5.0);
initialBC.setName("Heineken Consumer");
Calendar cal = Calendar.getInstance();
cal.set(2008, 12, 12);
initialBC.addHeinekenBeerToConsume(heineken1, cal.getTime());
cal.set(2009, 1, 1);
initialBC.addHeinekenBeerToConsume(heineken2, cal.getTime());
cal.set(2009, 2, 2);
initialBC.addHeinekenBeerToConsume(heineken3, cal.getTime());
em.persist(initialBC);
beerConsumerId = initialBC.getId();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, beerConsumerId);
assertTrue("The beer consumer read back did not match the original", getServerSession().compareObjects(initialBC, refreshedBC));
}
public void testReadNoviceBeerConsumer() {
NoviceBeerConsumer consumer = createEntityManager().find(NoviceBeerConsumer.class, m_noviceBeerConsumerId);
assertTrue("Error on reading back a NoviceBeerConsumer", consumer != null);
assertTrue("IQ Level was not persisted.", consumer.getIQ() == 100);
assertTrue("Incorrect number of acclaims returned.", consumer.getAcclaims().size() == 3);
assertTrue("Missing acclaim - 1", consumer.getAcclaims().contains(1));
assertTrue("Missing acclaim - 2", consumer.getAcclaims().contains(2));
assertTrue("Missing acclaim - 3", consumer.getAcclaims().contains(3));
assertTrue("Incorrect number of awards returned.", consumer.getAwards().size() == 3);
Integer awardCode = consumer.getAwards().get(1);
assertFalse("Missing award code - 1", awardCode == null);
assertTrue("Award code 1 is incorrect", awardCode.equals(1));
awardCode = consumer.getAwards().get(2);
assertFalse("Missing award code - 2", awardCode == null);
assertTrue("Award code 2 is incorrect", awardCode.equals(2));
awardCode = consumer.getAwards().get(3);
assertFalse("Missing award code - 3", awardCode == null);
assertTrue("Award code 3 is incorrect", awardCode.equals(3));
assertTrue("Incorrect number of designations returned.", consumer.getDesignations().size() == 5);
assertTrue("Missing designation - 5 at index 0", consumer.getDesignations().get(0).equals("5"));
assertTrue("Missing designation - 4 at index 1", consumer.getDesignations().get(1).equals("4"));
assertTrue("Missing designation - 2 at index 2", consumer.getDesignations().get(2).equals("2"));
assertTrue("Missing designation - 3 at index 3", consumer.getDesignations().get(3).equals("3"));
assertTrue("Missing designation - 1 at index 4", consumer.getDesignations().get(4).equals("1"));
assertTrue("Incorrect number of records returned.", consumer.getRecords().size() == 1);
}
public void testReadExpertBeerConsumer() {
ExpertBeerConsumer consumer = createEntityManager().find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
assertTrue("Error on reading back an ExpertBeerConsumer", consumer != null);
assertTrue("IQ Level was not persisted.", consumer.getIQ() == 110);
assertTrue("Incorrect number of acclaims returned.", consumer.getAcclaims().size() == 3);
assertTrue("Missing acclaim - A", consumer.getAcclaims().contains("A"));
assertTrue("Missing acclaim - B", consumer.getAcclaims().contains("B"));
assertTrue("Missing acclaim - C", consumer.getAcclaims().contains("C"));
//assertTrue("Incorrect number of audio returned.", consumer.getAudio().size() == 3);
// don't individually check them, assume they are correct.
assertTrue("Incorrect number of awards returned.", consumer.getAwards().size() == 3);
String awardCode = consumer.getAwards().get("A");
assertFalse("Missing award code - A", awardCode == null);
assertTrue("Award code A is incorrect", awardCode.equals("A"));
awardCode = consumer.getAwards().get("B");
assertFalse("Missing award code - B", awardCode == null);
assertTrue("Award code B is incorrect", awardCode.equals("B"));
awardCode = consumer.getAwards().get("C");
assertFalse("Missing award code - C", awardCode == null);
assertTrue("Award code C is incorrect", awardCode.equals("C"));
assertTrue("Incorrect number of designations returned.", consumer.getDesignations().size() == 2);
assertTrue("Missing designation - A", consumer.getDesignations().contains("A"));
assertTrue("Missing designation - B", consumer.getDesignations().contains("B"));
assertTrue("Incorrect number of quotes returned.", consumer.getQuotes().size() == 2);
String quote = consumer.getQuotes().get(m_quote1Stamp);
assertFalse("Missing quote from Jan 1, 2009", quote == null);
assertTrue("Quote from Jan 1, 2009 was incorrect", quote.equals(QUOTE_ONE));
quote = consumer.getQuotes().get(m_quote2Stamp);
assertFalse("Missing quote from Jul 9, 2005", quote == null);
assertTrue("Quote from Jul 9, 2005 was incorrect", quote.equals(QUOTE_TWO));
assertTrue("Incorrect number of records returned.", consumer.getRecords().size() == 2);
assertTrue("Incorrect first record", consumer.getRecords().get(0).getDescription().equals("Fastest beer ever consumed - 10 ms"));
assertTrue("Incorrect last record", consumer.getRecords().get(1).getDescription().equals("Most beers consumed in a second - 5"));
}
// Bug 296606 - issues with ElementCollections
// This test should be run after testCreateExpertBearConsumer
// This test makes changes, so testReadExpertBeerConsumer will fail after this test.
public void testExpertBeerConsumerRecordsCRUD() {
String errorMsg = "";
int nRecords;
int nRecordsExpected = 2;
clearCache();
EntityManager em = createEntityManager();
try {
// read all Records inside transaction
beginTransaction(em);
ExpertBeerConsumer consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
// trigger indirection
nRecords = consumer.getRecords().size();
// Bug 296606 - issues with ElementCollections cause commit to fail with NPE
// Before the bug was fixed, the workaround was to annotate Record with @ChangeTracking(ChangeTrackingType.DEFERRED)
commitTransaction(em);
closeEntityManager(em);
if(nRecords != nRecordsExpected) {
errorMsg += "wrong number of records after read; ";
}
// remove Record
em = createEntityManager();
beginTransaction(em);
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
Record recordToRemove = consumer.getRecords().iterator().next();
consumer.getRecords().remove(recordToRemove);
commitTransaction(em);
closeEntityManager(em);
nRecordsExpected--;
// verify in cache
em = createEntityManager();
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
closeEntityManager(em);
nRecords = consumer.getRecords().size();
if(nRecords != nRecordsExpected) {
errorMsg += "cache: wrong number of records after remove; ";
}
// verify in db
clearCache();
em = createEntityManager();
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
closeEntityManager(em);
nRecords = consumer.getRecords().size();
if(nRecords != nRecordsExpected) {
errorMsg += "db: wrong number of records after remove; ";
}
// add Record
Record record1 = new Record();
record1.setDescription("Original");
record1.setDate(Helper.dateFromYearMonthDate(2009, 1, 1));
record1.setLocation(new Location("Ottawa", "Canada"));
Venue venue1 = new Venue();
venue1.setAttendance(10);
venue1.setName("Original");
record1.setVenue(venue1);
em = createEntityManager();
beginTransaction(em);
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
consumer.getRecords().add(record1);
commitTransaction(em);
closeEntityManager(em);
nRecordsExpected++;
// verify in cache
em = createEntityManager();
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
closeEntityManager(em);
nRecords = consumer.getRecords().size();
if(nRecords != nRecordsExpected) {
errorMsg += "cache: wrong number of records after add; ";
}
// verify in db
clearCache();
em = createEntityManager();
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
closeEntityManager(em);
nRecords = consumer.getRecords().size();
if(nRecords != nRecordsExpected) {
errorMsg += "db: wrong number of records after add; ";
}
// update all Records one by one.
String newDescription = "New Description ";
String newName = "New Name ";
em = createEntityManager();
beginTransaction(em);
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
int i=0;
Iterator<Record> it = consumer.getRecords().iterator();
while(it.hasNext()) {
Record record = it.next();
String index = Integer.toString(i++);
record.setDescription(newDescription + index);
record.getVenue().setName(newName + index );
}
// Bug 296606 - issues with ElementCollections cause commit to fail with NPE
// Before the bug was fixed, the workaround was to annotate both Record and Venue with @ChangeTracking(ChangeTrackingType.DEFERRED).
// With that workaround the test still used to fail - Record and Venue were not updated in the data base.
// Before the bug was fixed, the workaround for that was to set property "eclipselink.weaving.internal" to "false" in persistence.xml.
commitTransaction(em);
// verify in cache
em = createEntityManager();
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
closeEntityManager(em);
nRecords = consumer.getRecords().size();
if(nRecords != nRecordsExpected) {
errorMsg += "cache: wrong number of records after update; ";
}
HashSet<String> usedDescriptions = new HashSet(nRecords);
HashSet<String> usedNames = new HashSet(nRecords);
it = consumer.getRecords().iterator();
while(it.hasNext()) {
Record record = it.next();
String description = record.getDescription();
if(!description.startsWith(newDescription)) {
errorMsg += "cache: wrong record description after update; ";
}
usedDescriptions.add(description);
String name = record.getVenue().getName();
if(!name.startsWith(newName)) {
errorMsg += "cache: wrong venue name after update; ";
}
usedNames.add(name);
}
if(usedDescriptions.size() != nRecords) {
errorMsg += "cache: records with same description; ";
}
if(usedNames.size() != nRecords) {
errorMsg += "cache: venues with same name; ";
}
// verify in db
clearCache();
em = createEntityManager();
consumer = em.find(ExpertBeerConsumer.class, m_expertBeerConsumerId);
closeEntityManager(em);
nRecords = consumer.getRecords().size();
if(nRecords != nRecordsExpected) {
errorMsg += "db: wrong number of records after update; ";
}
usedDescriptions.clear();
usedNames.clear();
it = consumer.getRecords().iterator();
while(it.hasNext()) {
Record record = it.next();
String description = record.getDescription();
if(!description.startsWith(newDescription)) {
errorMsg += "db: wrong record description after update; ";
}
usedDescriptions.add(description);
String name = record.getVenue().getName();
if(!name.startsWith(newName)) {
errorMsg += "db: wrong venue name after update; ";
}
usedNames.add(name);
}
if(usedDescriptions.size() != nRecords) {
errorMsg += "db: records with same description; ";
}
if(usedNames.size() != nRecords) {
errorMsg += "db: venues with same name; ";
}
if(errorMsg.length() > 0) {
fail(errorMsg);
}
} finally {
if(em != null) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
if(isOnServer()) {
closeEntityManager(em);
} else if(em.isOpen()) {
closeEntityManager(em);
}
}
}
}
public void testRedStripeExpertConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
ExpertBeerConsumer initialEBC = new ExpertBeerConsumer();
initialEBC.setAccredidation(new Accredidation());
int beerConsumerId = 0;
try {
RedStripe redStripe1 = new RedStripe();
redStripe1.setAlcoholContent(5.0);
initialEBC.addRedStripeBeersToConsume(redStripe1, "1");
RedStripe redStripe2 = new RedStripe();
redStripe2.setAlcoholContent(5.0);
initialEBC.addRedStripeBeersToConsume(redStripe2, "2");
initialEBC.setName("Expert Red Stripe Consumer");
em.persist(initialEBC);
beerConsumerId = initialEBC.getId();
commitTransaction(em);
} catch (RuntimeException e) {
e.printStackTrace();
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
ExpertBeerConsumer refreshedEBC = em.find(ExpertBeerConsumer.class, beerConsumerId);
assertTrue("The expert beer consumer read back did not match the original", getServerSession().compareObjects(initialEBC, refreshedEBC));
}
public void testRedStripeNoviceConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
NoviceBeerConsumer initialNBC = new NoviceBeerConsumer();
initialNBC.setAccredidation(new Accredidation());
int beerConsumerId = 0;
try {
RedStripe redStripe1 = new RedStripe();
redStripe1.setAlcoholContent(5.0);
initialNBC.addRedStripeBeersToConsume(redStripe1, "3");
RedStripe redStripe2 = new RedStripe();
redStripe2.setAlcoholContent(5.0);
initialNBC.addRedStripeBeersToConsume(redStripe2, "4");
initialNBC.setName("Novice Red Stripe Consumer");
em.persist(initialNBC);
beerConsumerId = initialNBC.getId();
commitTransaction(em);
} catch (RuntimeException e) {
e.printStackTrace();
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
closeEntityManager(em);
clearCache();
em = createEntityManager();
NoviceBeerConsumer refreshedNBC = em.find(NoviceBeerConsumer.class, beerConsumerId);
assertTrue("The novice beer consumer read back did not match the original", getServerSession().compareObjects(initialNBC, refreshedNBC));
}
public void testUpdateBeerConsumer() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
BeerConsumer beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
// Create a detached object that mirrors the beer consumer from
// testCreateBeerConsumer.
BeerConsumer beerConsumerDetached = new BeerConsumer();
beerConsumerDetached.setName(beerConsumer.getName());
beerConsumerDetached.setId(beerConsumer.getId());
beerConsumerDetached.setVersion(beerConsumer.getVersion());
Blue blue = em.find(Blue.class, m_blueId);
beerConsumerDetached.addBlueBeerToConsume(blue);
em.merge(beerConsumerDetached);
commitTransaction(em);
} catch (RuntimeException e) {
e.printStackTrace();
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during the merge of the detached beer consumer: [" + e.getMessage() + "]");
}
closeEntityManager(em);
}
public void testVersionUpdateOnElementCollectionChange() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
BeerConsumer beerConsumer = (BeerConsumer) em.createQuery("select b from BeerConsumer b join b.redStripes r").getResultList().get(0);
int currentVersion = beerConsumer.getVersion();
beerConsumer.getRedStripes().put("version", new RedStripe(Double.valueOf("343")));
commitTransaction(em);
assertTrue("Did not increment version for change to element collection", beerConsumer.getVersion() == ++currentVersion);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
// Re-throw exception to ensure stacktrace appears in test result.
throw e;
}
closeEntityManager(em);
}
// Test the clone method works with LAZY attributes at multiple levels of an inheritance hierarchy
public void testInheritedClone() {
EntityManager em = createEntityManager();
beginTransaction(em);
SerialNumber serialNumber = new SerialNumber();
em.persist(serialNumber);
Alpine alpine = new Alpine(serialNumber);
alpine.setBestBeforeDate(Helper.dateFromYearMonthDate(2005, 8, 21));
alpine.setAlcoholContent(5.0);
alpine.setClassification(Alpine.Classification.BITTER);
alpine.addInspectionDate(new Date(System.currentTimeMillis()));
alpine.getBeerConsumer();
Alpine clone = null;
try{
clone = alpine.clone();
} catch (CloneNotSupportedException ex){
fail("Caught CloneNotSupportedException " + ex);
}
BeerConsumer consumer = new BeerConsumer();
consumer.setName("Keith Alexander");
BlueLight blueLight = new BlueLight();
blueLight.setAlcoholContent(4.0f);
blueLight.setUniqueKey(new BigInteger((Long.valueOf(System.currentTimeMillis()).toString())));
em.persist(blueLight);
consumer.addBlueLightBeerToConsume(blueLight);
clone.setBeerConsumer(consumer);
consumer.addAlpineBeerToConsume(clone);
em.persist(clone);
em.persist(consumer);
if (alpine.getBeerConsumer() == clone.getBeerConsumer()) {
fail("Changing clone beerConsumer changed original.");
}
commitTransaction(em);
Integer alpineId = clone.getId();
Integer consumerId = consumer.getId();
BigDecimal blueLightId = blueLight.getId();
clearCache();
closeEntityManager(em);
em = createEntityManager();
beginTransaction(em);
alpine = em.find(Alpine.class, alpineId);
try{
clone = alpine.clone();
} catch (CloneNotSupportedException ex){
fail("Caught CloneNotSupportedException " + ex);
}
consumer = new BeerConsumer();
consumer.setName("Frank Keith");
clone.setBeerConsumer(consumer);
consumer.addAlpineBeerToConsume(clone);
clone.getBeerConsumer();
if (alpine.getBeerConsumer() == clone.getBeerConsumer()) {
fail("Changing clone beerConsumer changed original.");
}
if (alpine.getBeerConsumer() == null) {
fail("Changing clone address reset original to null.");
}
if (clone.getBeerConsumer() != consumer) {
fail("Changing clone did not work.");
}
try{
consumer = em.find(BeerConsumer.class, consumerId);
BeerConsumer consumerClone = (BeerConsumer)consumer.clone();
Iterator<Alpine> alpineIterator = consumer.getAlpineBeersToConsume().iterator();
while (alpineIterator.hasNext()){
alpine = alpineIterator.next();
assertTrue("The original beerConsumer has an alpine beer with an incorrect back pointer.", consumer == alpine.getBeerConsumer());
}
alpineIterator = consumerClone.getAlpineBeersToConsume().iterator();
while (alpineIterator.hasNext()){
alpine = alpineIterator.next();
assertTrue("The cloned beerConsumer has an alpine beer with an incorrect back pointer.", consumerClone == alpine.getBeerConsumer());
}
Iterator<BlueLight> blueLightIterator = consumer.getBlueLightBeersToConsume().iterator();
while (blueLightIterator.hasNext()){
blueLight = blueLightIterator.next();
assertTrue("The original beerConsumer has an BlueLight beer with an incorrect back pointer.", consumer == blueLight.getBeerConsumer());
}
blueLightIterator = consumerClone.getBlueLightBeersToConsume().iterator();
while (blueLightIterator.hasNext()){
blueLight = blueLightIterator.next();
assertTrue("The cloned beerConsumer has an BlueLight beer with an incorrect back pointer.", consumerClone == blueLight.getBeerConsumer());
}
} catch (CloneNotSupportedException e){
fail("Call to clone threw CloneNotSupportedException");
}
alpine = em.find(Alpine.class, clone.getId());
em.remove(alpine);
blueLight = em.find(BlueLight.class, blueLightId);
em.remove(blueLight);
consumer = em.find(BeerConsumer.class, consumerId);
em.remove(consumer);
commitTransaction(em);
closeEntityManager(em);
}
// BUG 227345
public void testCascadeRemove() {
BeerConsumer beerConsumer = null;
BlueLight blueLightPersisted = null;
BlueLight blueLightDetached = null;
EntityManager em = createEntityManager();
// Create and persist the beerConsumer
try {
beginTransaction(em);
beerConsumer = new BeerConsumer();
beerConsumer.setName("Beer Man");
blueLightPersisted = new BlueLight();
beerConsumer.getBlueLightBeersToConsume().add(blueLightPersisted);
blueLightPersisted.setBeerConsumer(beerConsumer);
em.persist(beerConsumer);
// Unique key must be set before commit.
blueLightPersisted.setUniqueKey(blueLightPersisted.getId().toBigInteger());
// They should be known by the EM
assertTrue(em.contains(beerConsumer));
assertTrue(em.contains(blueLightPersisted));
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
// Create BlueLightDetached and manage the relations
try {
beginTransaction(em);
blueLightDetached = new BlueLight();
blueLightDetached.setUniqueKey(new BigDecimal(blueLightPersisted.getUniqueKey().intValue() + 1).toBigInteger());
// Set the pointers
beerConsumer.getBlueLightBeersToConsume().add(blueLightDetached);
blueLightDetached.setBeerConsumer(beerConsumer);
// And now remove the beer consumer. The remove-operation should cascade
if (isOnServer()){
beerConsumer = em.find(BeerConsumer.class, m_beerConsumerId);
}
em.remove(beerConsumer);
// It's o.k. should be detached
assertFalse(em.contains(blueLightDetached));
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
try {
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during the remove of the BeerConsumer: [" + e.getMessage() + "]");
}
// Ensure neither the beer consumer nor the blue light
// persisted/detached are available.
assertFalse("The beer consumer was not removed", em.contains(beerConsumer));
assertFalse("The blue light persisted was not removed even though the its owning beer comsumer was removed", em.contains(blueLightPersisted));
assertFalse("The blue light detached was persisted even though the its owning beer comsumer was removed", em.contains(blueLightDetached));
closeEntityManager(em);
}
public void testBreakOrder_CorrectionType_EXCEPTION() {
// create BeerConsumer with designations
EntityManager em = createEntityManager();
beginTransaction(em);
NoviceBeerConsumer beerConsumer = new NoviceBeerConsumer();
beerConsumer.setAccredidation(new Accredidation());
beerConsumer.setName("Broken order");
beerConsumer.getDesignations().add("0");
beerConsumer.getDesignations().add("1");
beerConsumer.getDesignations().add("2");
try {
em.persist(beerConsumer);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
fail("failed to create beerConsumer");
}
Integer id = beerConsumer.getId();
try {
// break the order of designations
beginTransaction(em);
try {
em.createNativeQuery("UPDATE NOVICE_CONSUMER_DESIGNATIONS SET ORDER_COLUMN = null WHERE NOVICE_CONSUMER_ID = " + id +" AND ORDER_COLUMN = 0").executeUpdate();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
fail("failed to break order of designations");
} finally {
closeEntityManager(em);
}
// remove beerConsumer from the cache
clearCache();
// read back the beer consumer, reading of the list of designations with the broken order should trigger exception
em = createEntityManager();
try {
beerConsumer = em.find(NoviceBeerConsumer.class, id);
// trigger indirection
beerConsumer.getDesignations().size();
fail("Exception was expected - but not thrown");
} catch (RuntimeException e) {
boolean isCorrectException = false;
if(e instanceof QueryException) {
QueryException queryException = (QueryException)e;
if(((QueryException) e).getErrorCode() == QueryException.LIST_ORDER_FIELD_WRONG_VALUE) {
isCorrectException = true;
}
}
if(!isCorrectException) {
throw e;
}
} finally {
closeEntityManager(em);
}
} finally {
// clean up
em = createEntityManager();
beginTransaction(em);
try {
beerConsumer = em.find(NoviceBeerConsumer.class, id);
em.remove(beerConsumer);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
} finally {
closeEntityManager(em);
}
}
}
public void testBreakOrder_CorrectionType_READ_WRITE() {
// create BeerConsumer with committees
EntityManager em = createEntityManager();
beginTransaction(em);
ExpertBeerConsumer beerConsumer = new ExpertBeerConsumer();
beerConsumer.setName("Beer order");
beerConsumer.setAccredidation(new Accredidation());
Committee committee0 = new Committee();
committee0.setDescription("Broken Order 0");
beerConsumer.addCommittee(committee0);
Committee committee1 = new Committee();
committee1.setDescription("Broken Order 1");
beerConsumer.addCommittee(committee1);
Committee committee2 = new Committee();
committee2.setDescription("Broken Order 2");
beerConsumer.addCommittee(committee2);
try {
em.persist(beerConsumer);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
fail("failed to create beerConsumer");
}
Integer id = beerConsumer.getId();
try {
// break the order of committees
beginTransaction(em);
try {
em.createNativeQuery("UPDATE JPA_CONSUMER_COMMITTEE SET ORDER_COLUMN = null WHERE CONSUMER_ID = " + id +" AND ORDER_COLUMN = 0").executeUpdate();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
fail("failed to break order of committees");
} finally {
closeEntityManager(em);
}
// remove beerConsumer from the cache
clearCache();
// read back the beer consumer, reading of the list of committees with the broken should fix the order "on the fly":
// the default correction performed on the list substitutes null in the first element back to 0;
// then alter order of committees - that would cause the list order to be updated in the db (and become valid).
em = createEntityManager();
beginTransaction(em);
try {
beerConsumer = em.find(ExpertBeerConsumer.class, id);
// committees #1 and #2 switch their positions in the list.
Committee committee = beerConsumer.getCommittees().remove(2);
beerConsumer.getCommittees().add(1, committee);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
fail("failed to change committees order");
}
// now verify that the order in the db has been corrected
List<Number> results = em.createNativeQuery("SELECT ORDER_COLUMN FROM JPA_CONSUMER_COMMITTEE WHERE CONSUMER_ID = " +id+ " ORDER BY ORDER_COLUMN").getResultList();
int expectedSize = beerConsumer.getCommittees().size();
if(expectedSize != results.size()) {
closeEntityManager(em);
fail("read in "+ results.size() + " committees; expected " + expectedSize);
}
for(int i=0; i < expectedSize; i++) {
if(results.get(i) == null || results.get(i).intValue() != i) {
closeEntityManager(em);
fail("read in list in wrong order: " + results + "; expected: 0, 1, 2");
}
}
closeEntityManager(em);
} finally {
// clean up
em = createEntityManager();
beginTransaction(em);
try {
beerConsumer = em.find(ExpertBeerConsumer.class, id);
em.remove(beerConsumer);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
} finally {
closeEntityManager(em);
}
}
}
public void testMapOrphanRemoval(){
EntityManager em = createEntityManager();
beginTransaction(em);
BeerConsumer initialBC = new BeerConsumer();
int beerConsumerId = 0;
try {
Becks becks1 = new Becks();
becks1.setAlcoholContent(5.1);
BecksTag becksTag1 = new BecksTag();
becksTag1.setCallNumber("0A.789");
em.persist(becksTag1);
initialBC.setName("Becks Consumer");
initialBC.addBecksBeerToConsume(becks1, becksTag1);
em.persist(initialBC);
beerConsumerId = initialBC.getId();
em.flush();
clearCache();
BeerConsumer refreshedBC = em.find(BeerConsumer.class, beerConsumerId);
refreshedBC.getBecksBeersToConsume().remove(becksTag1);
em.flush();
clearCache();
becksTag1 = em.find(BecksTag.class, becksTag1.getId());
assertTrue("Key was deleted when it should not be.", becksTag1 != null);
becks1 = em.find(Becks.class, becks1.getId());
assertTrue("Orphan removal did not remove the orphan", becks1 == null);
rollbackTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
}
}
public void testSerializedElementCollectionMap(){
EntityManager em = createEntityManager();
beginTransaction(em);
try{
BeerConsumer initialBC = new BeerConsumer();
em.persist(initialBC);
SerialNumber serialNumber = new SerialNumber();
em.persist(serialNumber);
initialBC.addCommentLookup(serialNumber, "A test comment");
em.flush();
em.clear();
initialBC = em.find(BeerConsumer.class, initialBC.getId());
serialNumber = em.find(SerialNumber.class, serialNumber.getNumber());
assertTrue("The serialized map was not properly retrieved after persist.", initialBC.getCommentLookup().size() == 1);
assertTrue("The serialized map did not contain the proper entry.", initialBC.getCommentLookup().get(serialNumber) != null);
} finally {
rollbackTransaction(em);
closeEntityManager(em);
}
}
// this method is a test for the fix for bug 299847, prior to the fix, it fails when
// weaving is disabled
public void testAddToHeinekenBeerConsumerMap() {
EntityManager em = createEntityManager();
beginTransaction(em);
int beerConsumerId = 0;
int heinekenId = 0;
Calendar cal = Calendar.getInstance();
cal.set(2008, 12, 12);
try {
BeerConsumer initialBC = new BeerConsumer();
initialBC.setName("Heineken Consumer");
em.persist(initialBC);
Heineken heineken1 = new Heineken();
heineken1.setAlcoholContent(5.0);
em.persist(heineken1);
commitTransaction(em);
beerConsumerId = initialBC.getId();
heinekenId = heineken1.getId();
clearCache();
beginTransaction(em);
initialBC = em.find(BeerConsumer.class, initialBC.getId());
heineken1 = em.find(Heineken.class, heineken1.getId());
initialBC.addHeinekenBeerToConsume(heineken1, cal.getTime());
commitTransaction(em);
clearCache();
initialBC = em.find(BeerConsumer.class, initialBC.getId());
heineken1 = em.find(Heineken.class, heineken1.getId());
assertTrue("The beer consumer is not appropriately associated with the heineken.", heineken1.getBeerConsumer() != null);
assertTrue("The heineken is not appropriately associated with the beer consumer.", initialBC.getHeinekenBeersToConsume().size() == 1);
} catch (RuntimeException e) {
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
} finally {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
beginTransaction(em);
BeerConsumer consumer = em.find(BeerConsumer.class, beerConsumerId);
Heineken heineken = em.find(Heineken.class, heinekenId);
if (consumer != null){
em.remove(consumer);
}
if (heineken != null){
em.remove(heineken);
}
commitTransaction(em);
closeEntityManager(em);
}
}
public void testColumnUpdatableAndInsertable() {
EntityManager em = createEntityManager();
try {
// Create an official
beginTransaction(em);
OfficialEntry officialEntry = new OfficialEntry();
em.persist(officialEntry);
Official initialOfficial = new Official();
initialOfficial.setName("Gui Pelletier"); // insertable=true, updatable=false
initialOfficial.setAge(25); // insertable=false, updatable=true
initialOfficial.setSalary(50000); // insertable=true, updatable=false
initialOfficial.setBonus(10000); // insertable=false, updatable=true
// Tests multiple mappings to the same column. The M-1 is read only
// and the basic is the writable mapping.
initialOfficial.setOfficialEntry(officialEntry); // insertable=false, updatable=false
initialOfficial.setOfficialEntryId(officialEntry.getId()); // insertable=true, updatable=true
ServiceTime service = new ServiceTime();
service.setStartDate("Jan 1, 2008"); // insertable=true, updatable=false
service.setEndDate("Jul 1, 2010"); // insertable=false, updatable=true
initialOfficial.setServiceTime(service);
em.persist(initialOfficial);
commitTransaction(em);
// Close the EM, clear cache and get new EM.
closeEntityManager(em);
clearCache();
em = createEntityManager();
// Read the official and verify its content
beginTransaction(em);
Official official = em.find(Official.class, initialOfficial.getId());
assertTrue("The name was not inserted", official.getName().equals("Gui Pelletier"));
assertTrue("The age was inserted", official.getAge() == null);
assertTrue("The salary was not inserted", official.getSalary() == 50000);
assertTrue("The bonus was inserted", official.getBonus() == null);
assertTrue("The official entry was not inserted", official.getOfficialEntryId() == officialEntry.getId());
assertTrue("The embeddable start date was not inserted", official.getServiceTime().getStartDate().equals("Jan 1, 2008"));
assertTrue("The embeddable end date was inserted", official.getServiceTime().getEndDate() == null);
// Change the updatable=false fields:
official.setName("Guy Pelletier");
official.setSalary(100000);
official.getServiceTime().setStartDate("Jan 30, 2008");
// Update the insertable=false fields:
official.setAge(25);
official.setBonus(10000);
official.getServiceTime().setEndDate("Jul 1, 2010");
commitTransaction(em);
// Close the EM, clear cache and get new EM.
closeEntityManager(em);
clearCache();
em = createEntityManager();
// The refreshed official at this point should not have had any
// update changes to name but age should now be updated.
Official refreshedOfficial = em.find(Official.class, initialOfficial.getId());
assertTrue("The refreshedOfficial did not match the original", getServerSession().compareObjects(initialOfficial, refreshedOfficial));
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
fail("An exception was caught during create operation: [" + e.getMessage() + "]");
} finally {
closeEntityManager(em);
}
}
public void testColumnUpdatableAndInsertableThroughQuery() {
if ((JUnitTestCase.getServerSession()).getPlatform().isSymfoware()) {
getServerSession().logMessage("Test testColumnUpdatableAndInsertableThroughQuery skipped for this platform, "
+ "Symfoware doesn't support UpdateAll/DeleteAll on multi-table objects (see rfe 298193).");
return;
}
EntityManager em = createEntityManager();
try {
// Create an official
beginTransaction(em);
Official initialOfficial = new Official();
initialOfficial.setName("Gui Pelletier");
em.persist(initialOfficial);
commitTransaction(em);
// Close the EM, clear cache and get new EM.
closeEntityManager(em);
clearCache();
em = createEntityManager();
// Update the official using a named query.
beginTransaction(em);
Query query = em.createNamedQuery("UpdateOfficalName");
query.setParameter("name", "Guy");
query.setParameter("id", initialOfficial.getId());
query.executeUpdate();
Official modifiedOfficial = em.find(Official.class, initialOfficial.getId());
assertTrue("The name was not updated after executing the named query", modifiedOfficial.getName().equals("Guy"));
commitTransaction(em);
// Close the EM, clear cache and get new EM.
closeEntityManager(em);
clearCache();
em = createEntityManager();
Official refreshedOfficial = em.find(Official.class, modifiedOfficial.getId());
assertTrue("The refreshedOfficial did not match the modified", getServerSession().compareObjects(modifiedOfficial, refreshedOfficial));
} catch (Exception e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
fail("Update query failed: " + e.getMessage());
} finally {
closeEntityManager(em);
}
}
public void testElementCollectionMapEmbeddable(){
EntityManager em = createEntityManager();
try {
// Create an official
beginTransaction(em);
BeerConsumer consumer = new BeerConsumer();
consumer.setName("Lionel");
RedStripe rs = new RedStripe();
rs.setAlcoholContent(4.5);
consumer.addRedStripeByAlcoholContent(rs);
em.persist(consumer);
em.flush();
rs = new RedStripe();
rs.setAlcoholContent(3.5);
consumer.addRedStripeByAlcoholContent(rs);
em.flush();
} finally {
rollbackTransaction(em);
}
}
// Bug 282523
public void testRelatedBylawWrite(){
EntityManager em = createEntityManager();
try {
beginTransaction(em);
BuildingBylaw law = new BuildingBylaw();
law.setCity("EastTown");
law.setDescription("No west facing property.");
BuildingBylaw relatedLaw = new BuildingBylaw();
relatedLaw.setCity("EastTown");
relatedLaw.setDescription("No square houses");
law.setRelatedByLaw(relatedLaw);
em.persist(law);
em.persist(relatedLaw);
em.flush();
em.clear();
String jpqlString = "SELECT b FROM BuildingBylaw b WHERE b.number =" + law.getNumber();
law = (BuildingBylaw) em.createQuery(jpqlString).getSingleResult();
assertNotNull("BuildingBylaw not properly written.", law);
assertNotNull("ManyToOne with target type != actual type not properly written.", law.getRelatedByLaw());
} finally {
rollbackTransaction(em);
}
}
// Bug 282523
public void testInterfaceBylawWrite(){
EntityManager em = createEntityManager();
try {
beginTransaction(em);
BuildingBylaw law = new BuildingBylaw();
law.setCity("EastTown");
law.setDescription("No west facing property.");
BuildingBylaw relatedLaw = new BuildingBylaw();
relatedLaw.setCity("EastTown");
relatedLaw.setDescription("No square houses");
law.setReference(relatedLaw);
em.persist(law);
em.persist(relatedLaw);
em.flush();
em.clear();
String jpqlString = "SELECT b FROM BuildingBylaw b WHERE b.number =" + law.getNumber();
law = (BuildingBylaw) em.createQuery(jpqlString).getSingleResult();
assertNotNull("BuildingBylaw not properly written.", law);
assertNotNull("ManyToOne with target type != actual type not properly written.", law.getReference());
} finally {
rollbackTransaction(em);
}
}
// Bug 334175
public void testEmbeddableAggregateCollectionAndAggregate(){
EntityManager em = createEntityManager();
beginTransaction(em);
BeerConsumer consumer = new BeerConsumer();
consumer.setName("Lionel");
RedStripe rs = new RedStripe();
rs.setAlcoholContent(4.5);
consumer.addRedStripeByAlcoholContent(rs);
em.persist(consumer);
Official official = new Official();
official.setName("George");
rs = new RedStripe();
rs.setAlcoholContent(4.6);
official.setLastRedStripeConsumed(rs);
em.persist(official);
em.flush();
em.clear();
clearCache();
consumer = em.find(BeerConsumer.class, consumer.getId());
assertNotNull("BeerConsumer had null red stripes.", consumer.getRedStripes());
assertTrue("BeerConsumer had wrong number of red stripes.", consumer.getRedStripesByAlcoholContent().size() == 1);
assertTrue("BeerConsumer had wrong red stripe.", consumer.getRedStripesByAlcoholContent().get(4.5) != null);
official = em.find(Official.class, official.getId());
assertNotNull("Official had null red stripe.", official.getLastRedStripeConsumed());
assertTrue("Official had the wrong red stripe", official.getLastRedStripeConsumed().getAlcoholContent() == 4.6);
rollbackTransaction(em);
}
// Bug 370975
public void testNodeImplWeaving(){
if (isWeavingEnabled()) {
Class[] interfaces = NodeImpl.class.getInterfaces();
boolean found = false;
for (Class c : interfaces){
if (c == PersistenceWeaved.class){
found = true;
}
}
assertTrue("NodeImpl was not weaved.", found);
}
}
// Bug 384527
public void testEmbeddaleCollectionMapEmbeddableRead(){
EntityManager em = createEntityManager();
try {
beginTransaction(em);
BeerConsumer consumer = new BeerConsumer();
consumer.setName("Lionel");
RedStripe rs = new RedStripe();
rs.setAlcoholContent(4.5);
consumer.addRedStripeByAlcoholContent(rs);
rs = new RedStripe();
rs.setAlcoholContent(5.0);
consumer.addRedStripeByAlcoholContent(rs);
em.persist(consumer);
em.flush();
clearCache();
em.clear();
consumer = em.find(BeerConsumer.class, consumer.getId());
Integer version = consumer.getVersion();
consumer.getRedStripesByAlcoholContent().get(4.5);
em.flush();
clearCache();
em.clear();
consumer = em.find(BeerConsumer.class, consumer.getId());
assertTrue("The version was updated on a read.", consumer.getVersion().equals(version));
} finally {
rollbackTransaction(em);
}
}
public void testInterfaces(){
// ensure weaving has occured
EntityManager em = createEntityManager();
em.getCriteriaBuilder();
Class[] testClasses = new Class[]{BeerConsumer.class, Alpine.class, NoviceBeerConsumer.class, Bluish.class, Blue.class, Corona.class, ExpertBeerConsumer.class, Heineken.class};
for (int index = 0;index<testClasses.length;index++){
Class[] interfaces = testClasses[index].getInterfaces();
Type[] genericInterfaces = testClasses[index].getGenericInterfaces();
if (interfaces.length != genericInterfaces.length){
fail("Weaving failed to correctly update interfaces for " + testClasses[index]);
}
for (int i=0;i<interfaces.length;i++){
String comparisonString = null;
if (genericInterfaces[i] instanceof Class<?>){
comparisonString = ((Class<?>)genericInterfaces[i]).getCanonicalName();
} else if (genericInterfaces[i] instanceof ParameterizedType){
comparisonString = ((Class<?>)((ParameterizedType)genericInterfaces[i]).getRawType()).getCanonicalName();
}
assertEquals("Mismatched interface on " + testClasses[index] + ": " + interfaces[i].getCanonicalName() + " != " + comparisonString, interfaces[i].getCanonicalName(), comparisonString);
}
}
}
// Bug 406957 - Copy fails on AggregateCollectionMapping and on map with @MapKeyColumn
public void testCopyMapKeyMap() {
Calendar cal = Calendar.getInstance();
BeerConsumer consumer = new BeerConsumer();
consumer.setId(1);
consumer.setName("A");
Heineken heineken = new Heineken();
heineken.setAlcoholContent(5.0);
heineken.setId(11);
Date date = cal.getTime();
consumer.addHeinekenBeerToConsume(heineken, date);
EntityManager em = createEntityManager();
CopyGroup copyAll = new CopyGroup();
copyAll.cascadeAllParts();
BeerConsumer consumerCopy = (BeerConsumer)JpaHelper.getEntityManager(em).copy(consumer, copyAll);
if (consumerCopy.getHeinekenBeersToConsume().size() != consumer.getHeinekenBeersToConsume().size()) {
fail("consumerCopy.getHeinekenBeersToConsume().size() = " + consumerCopy.getHeinekenBeersToConsume().size() + "; "+consumer.getHeinekenBeersToConsume().size()+" was expected");
}
if (consumerCopy.getHeinekenBeersToConsume() == consumer.getHeinekenBeersToConsume()) {
fail("consumerCopy.getHeinekenBeersToConsume() == consumer.getHeinekenBeersToConsume()");
}
Map.Entry<Date, Heineken> entry = (Map.Entry<Date, Heineken>)consumerCopy.getHeinekenBeersToConsume().entrySet().iterator().next();
Date dateCopy = entry.getKey();
Heineken heinekenCopy = entry.getValue();
if (!date.equals(dateCopy)) {
fail("!date.equals(dateCopy)");
}
if (heineken == heinekenCopy) {
fail("heineken == heinekenCopy");
}
if (heineken.getAlcoholContent() != heinekenCopy.getAlcoholContent()) {
fail("heineken.getAlcoholContent() != heinekenCopy.getAlcoholContent()");
}
}
}