blob: 7d230b7026e3702aedac56dd7203007b439019e1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.generationtype;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.jdbc.sql.H2Dictionary;
import org.apache.openjpa.jdbc.sql.HSQLDictionary;
import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
import org.apache.openjpa.jdbc.sql.MySQLDictionary;
import org.apache.openjpa.jdbc.sql.OracleDictionary;
import org.apache.openjpa.jdbc.sql.PostgresDictionary;
import org.apache.openjpa.jdbc.sql.SQLServerDictionary;
import org.apache.openjpa.jdbc.sql.SolidDBDictionary;
import org.apache.openjpa.jdbc.sql.SybaseDictionary;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestMultipleSchemaNames extends SingleEMFTestCase {
@Override
public void setUp() {
// Need to skip tests on some databases.
// See createSchemas() comment at the bottom
setUnsupportedDatabases(
MariaDBDictionary.class,
MySQLDictionary.class,
OracleDictionary.class,
SQLServerDictionary.class,
SybaseDictionary.class);
if (isTestsDisabled()) {
// getLog().trace("TestMultipleSchemaNames() - Skipping all tests - Not supported on this DB");
return;
}
createSchemas();
setUp(Dog1.class, Dog2.class, Dog3.class, Dog4.class,
DogTable.class, DogTable2.class, DogTable3.class, DogTable4.class);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// cleanup database first
Query qry = em.createQuery("select d from Dog1 d");
List result = qry.getResultList();
for (Object o4 : result) {
Dog1 Obj = (Dog1) o4;
em.remove(Obj);
}
Query qry2 = em.createQuery("select d from Dog2 d");
List result2 = qry2.getResultList();
for (Object o3 : result2) {
Dog2 Obj = (Dog2) o3;
em.remove(Obj);
}
Query qry3 = em.createQuery("select d from DogTable d");
List result3 = qry3.getResultList();
for (Object o2 : result3) {
DogTable Obj = (DogTable) o2;
em.remove(Obj);
}
Query qry4 = em.createQuery("select d from DogTable2 d");
List result4 = qry4.getResultList();
for (Object o1 : result4) {
DogTable2 Obj = (DogTable2) o1;
em.remove(Obj);
}
Query qry5 = em.createQuery("select d from DogTable3 d");
List result5 = qry5.getResultList();
for (Object element : result5) {
DogTable3 Obj = (DogTable3) element;
em.remove(Obj);
}
Query qry6 = em.createQuery("select d from DogTable4 d");
List result6 = qry6.getResultList();
for (Object item : result6) {
DogTable4 Obj = (DogTable4) item;
em.remove(Obj);
}
Query qry7 = em.createQuery("select d from Dog3 d");
List result7 = qry7.getResultList();
for (Object value : result7) {
Dog3 Obj = (Dog3) value;
em.remove(Obj);
}
Query qry8 = em.createQuery("select d from Dog4 d");
List result8 = qry8.getResultList();
for (Object o : result8) {
Dog4 Obj = (Dog4) o;
em.remove(Obj);
}
Query delschema1 = em.createNativeQuery(
"delete from schema1.openjpa_sequence_table");
delschema1.executeUpdate();
Query delschema2 = em.createNativeQuery(
"delete from schema2.openjpa_sequence_table");
delschema2.executeUpdate();
Query delgentable = em.createNativeQuery("delete from schema1.id_gen1");
delgentable.executeUpdate();
Query delgentable2 = em
.createNativeQuery("delete from schema2.id_gen2");
delgentable2.executeUpdate();
Query delgentable3 = em
.createNativeQuery("delete from schema3g.id_gen3");
delgentable3.executeUpdate();
Query delgentable4 = em
.createNativeQuery("delete from schema4g.id_gen4");
delgentable4.executeUpdate();
em.getTransaction().commit();
em.close();
}
public void testGeneratedAUTO() {
EntityManager em = emf.createEntityManager();
OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
em.getTransaction().begin();
Dog1 dog1 = new Dog1();
dog1.setName("helloDog1");
dog1.setPrice(12000);
em.persist(dog1);
Dog1 dog1a = new Dog1();
dog1a.setName("helloDog2");
dog1a.setPrice(22000);
em.persist(dog1a);
// add dog2
Dog2 dog2 = new Dog2();
dog2.setName("helloDog3");
dog2.setPrice(15000);
em.persist(dog2);
Dog2 dog2a = new Dog2();
dog2a.setName("helloDog4");
dog2a.setPrice(25000);
em.persist(dog2a);
em.getTransaction().commit();
Dog1 dog1x = em.find(Dog1.class, kem.getObjectId(dog1));
// Derby can't guarantee the order of the generated value, therefore,
// we can't assert the id based on the order. For db2, we see the id
// value in the right order
assertTrue(dog1x.getId2() == 1 || dog1x.getId2() == 2);
assertEquals(dog1x.getName(), "helloDog1");
dog1x.setName("Dog1");
dog1x.setDomestic(true);
Dog1 dog11 = em.find(Dog1.class, kem.getObjectId(dog1a));
assertTrue(dog11.getId2() == 1 || dog11.getId2() == 2);
assertEquals(dog11.getName(), "helloDog2");
dog11.setName("Dog2");
dog11.setDomestic(true);
// update dog2
Dog2 dog2x = em.find(Dog2.class, kem.getObjectId(dog2));
assertTrue(dog2x.getId2() == 1 || dog2x.getId2() == 2);
assertEquals(dog2x.getName(), "helloDog3");
dog2x.setName("Dog3");
dog2x.setDomestic(true);
Dog2 dog21 = em.find(Dog2.class, kem.getObjectId(dog2a));
assertTrue(dog21.getId2() == 1 || dog21.getId2() == 2);
assertEquals(dog21.getName(), "helloDog4");
dog21.setName("Dog4");
dog21.setDomestic(true);
// get the update dog name
em.getTransaction().begin();
Query qry1 = em.createQuery("select d from Dog1 d order by d.name");
List result1 = qry1.getResultList();
for (int index = 0; index < result1.size(); index++) {
Dog1 dog4 = (Dog1) result1.get(index);
int i = index + 1;
assertTrue(dog4.getId2() == 1 || dog4.getId2() == 2);
assertEquals(dog4.getName(), "Dog" + i);
}
Query qry2 = em.createQuery("select d from Dog2 d order by d.name");
List result2 = qry2.getResultList();
for (int index = 0; index < result2.size(); index++) {
Dog2 dog5 = (Dog2) result2.get(index);
assertTrue(dog5.getId2() == 1 || dog5.getId2() == 2);
int j = index + 3;
assertEquals(dog5.getName(), "Dog" + j);
}
em.getTransaction().commit();
em.close();
}
public void testGeneratedTABLE() {
EntityManager em = emf.createEntityManager();
OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
em.getTransaction().begin();
DogTable dog1 = new DogTable();
dog1.setName("helloDog1");
dog1.setPrice(12000);
em.persist(dog1);
DogTable dog1a = new DogTable();
dog1a.setName("helloDog2");
dog1a.setPrice(22000);
em.persist(dog1a);
// add dog2
DogTable2 dog2 = new DogTable2();
dog2.setName("helloDog3");
dog2.setPrice(15000);
em.persist(dog2);
DogTable2 dog2a = new DogTable2();
dog2a.setName("helloDog4");
dog2a.setPrice(25000);
em.persist(dog2a);
// add dog3
DogTable3 dog3 = new DogTable3();
dog3.setName("helloDog5");
dog3.setPrice(15001);
em.persist(dog3);
DogTable3 dog3a = new DogTable3();
dog3a.setName("helloDog6");
dog3a.setPrice(25001);
em.persist(dog3a);
// add dog4
DogTable4 dog4 = new DogTable4();
dog4.setName("helloDog7");
dog4.setPrice(15002);
em.persist(dog4);
DogTable4 dog4a = new DogTable4();
dog4a.setName("helloDog8");
dog4a.setPrice(25002);
em.persist(dog4a);
em.getTransaction().commit();
DogTable dog1x = em.find(DogTable.class, kem.getObjectId(dog1));
assertTrue(dog1x.getId2() == 20 || dog1x.getId2() == 21);
assertEquals(dog1x.getName(), "helloDog1");
dog1x.setName("Dog1");
dog1x.setDomestic(true);
DogTable dog11 = em.find(DogTable.class, kem.getObjectId(dog1a));
assertTrue(dog11.getId2() == 20 || dog11.getId2() == 21);
assertEquals(dog11.getName(), "helloDog2");
dog11.setName("Dog2");
dog11.setDomestic(true);
// update dog2
DogTable2 dog2x = em.find(DogTable2.class, kem.getObjectId(dog2));
assertTrue(dog2x.getId2() == 100 || dog2x.getId2() == 101);
assertEquals(dog2x.getName(), "helloDog3");
dog2x.setName("Dog3");
dog2x.setDomestic(true);
DogTable2 dog21 = em.find(DogTable2.class, kem.getObjectId(dog2a));
assertTrue(dog21.getId2() == 100 || dog21.getId2() == 101);
assertEquals(dog21.getName(), "helloDog4");
dog21.setName("Dog4");
dog21.setDomestic(true);
// update dog3
DogTable3 dog3x = em.find(DogTable3.class, kem.getObjectId(dog3));
assertTrue(dog3x.getId2() == 100 || dog3x.getId2() == 101);
assertEquals(dog3x.getName(), "helloDog5");
dog3x.setName("Dog5");
dog3x.setDomestic(true);
DogTable3 dog31 = em.find(DogTable3.class, kem.getObjectId(dog3a));
assertTrue(dog31.getId2() == 100 || dog31.getId2() == 101);
assertEquals(dog31.getName(), "helloDog6");
dog31.setName("Dog6");
dog31.setDomestic(true);
// update dog4
DogTable4 dog4x = em.find(DogTable4.class, kem.getObjectId(dog4));
assertTrue(dog4x.getId2() == 100 || dog4x.getId2() == 101);
assertEquals(dog4x.getName(), "helloDog7");
dog4x.setName("Dog7");
dog4x.setDomestic(true);
DogTable4 dog41 = em.find(DogTable4.class, kem.getObjectId(dog4a));
assertTrue(dog41.getId2() == 100 || dog41.getId2() == 101);
assertEquals(dog41.getName(), "helloDog8");
dog41.setName("Dog8");
dog41.setDomestic(true);
// get the update dog name
em.getTransaction().begin();
Query qry1 = em.createQuery("select d from DogTable d order by d.name");
List result1 = qry1.getResultList();
for (int index = 0; index < result1.size(); index++) {
DogTable dog1xx = (DogTable) result1.get(index);
assertTrue(dog1xx.getId2() == 20 || dog1xx.getId2() == 21);
int j = index + 1;
assertEquals(dog1xx.getName(), "Dog" + j);
}
Query qry2 = em
.createQuery("select d from DogTable2 d order by d.name");
List result2 = qry2.getResultList();
for (int index = 0; index < result2.size(); index++) {
DogTable2 dog2xx = (DogTable2) result2.get(index);
assertTrue(dog2xx.getId2() == 100 || dog2xx.getId2() == 101);
int j = index + 3;
assertEquals(dog2xx.getName(), "Dog" + j);
}
Query qry3 = em
.createQuery("select d from DogTable3 d order by d.name");
List result3 = qry3.getResultList();
for (int index = 0; index < result3.size(); index++) {
DogTable3 dog3xx = (DogTable3) result3.get(index);
assertTrue(dog3xx.getId2() == 100 || dog3xx.getId2() == 101);
int j = index + 5;
assertEquals(dog3xx.getName(), "Dog" + j);
}
Query qry4 = em
.createQuery("select d from DogTable4 d order by d.name");
List result4 = qry4.getResultList();
for (int index = 0; index < result4.size(); index++) {
DogTable4 dog4xx = (DogTable4) result4.get(index);
assertTrue(dog4xx.getId2() == 100 || dog4xx.getId2() == 101);
int j = index + 7;
assertEquals(dog4xx.getName(), "Dog" + j);
}
em.getTransaction().commit();
em.close();
}
public void testGeneratedIDENTITY() {
EntityManager em = emf.createEntityManager();
OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
// Dog3 is a schema dog.
em.getTransaction().begin();
Dog3 dog30 = new Dog3();
dog30.setName("Dog30");
em.persist(dog30);
Dog3 dog31 = new Dog3();
dog31.setName("Dog31");
em.persist(dog31);
em.getTransaction().commit();
// We can't assume generated values start with 1 as
// the table might have already existed and had some rows.
Dog3 dog30x = em.find(Dog3.class, kem.getObjectId(dog30));
Dog3 dog31x = em.find(Dog3.class, kem.getObjectId(dog31));
assertTrue((dog30x.getId() + 1 == dog31x.getId()) ||
(dog30x.getId() == dog31x.getId() + 1));
assertEquals(dog30x.getName(), "Dog30");
// Dog4 is a non-schema dog.
em.getTransaction().begin();
Dog4 dog40 = new Dog4();
dog40.setName("Dog40");
em.persist(dog40);
Dog4 dog41 = new Dog4();
dog41.setName("Dog41");
em.persist(dog41);
em.getTransaction().commit();
Dog4 dog40x = em.find(Dog4.class, kem.getObjectId(dog40));
Dog4 dog41x = em.find(Dog4.class, kem.getObjectId(dog41));
assertTrue((dog40x.getId() + 1 == dog41x.getId()) ||
(dog40x.getId() == dog41x.getId() + 1));
assertEquals(dog40x.getName(), "Dog40");
em.close();
}
/**
* Create necessary schemas if running on PostgreSQL, H2, solidDB or HSQLDB as they do
* not create them automatically.
* Oracle, MySQL, MSSQL and Sybase also don't create schemas automatically but
* we give up as they treat schemas in special ways.
*/
private void createSchemas() {
OpenJPAEntityManagerFactorySPI tempEmf = createEMF();
DBDictionary dict = ((JDBCConfiguration) tempEmf.getConfiguration()).getDBDictionaryInstance();
if (!(dict instanceof PostgresDictionary || dict instanceof H2Dictionary ||
dict instanceof SolidDBDictionary || dict instanceof HSQLDictionary)) {
closeEMF(tempEmf);
return;
}
OpenJPAEntityManagerSPI em = tempEmf.createEntityManager();
String[] schemas =
{ "SCHEMA1", "SCHEMA2", "SCHEMA3", "SCHEMA3G", "SCHEMA4G" };
for (String schema : schemas) {
try {
em.getTransaction().begin();
Query q = em.createNativeQuery("create schema " + schema);
q.executeUpdate();
em.getTransaction().commit();
} catch (PersistenceException e) {
em.getTransaction().rollback();
}
}
closeEM(em);
closeEMF(tempEmf);
}
} // end of TestMultipleSchemaNames