/* | |
* 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.slice; | |
import java.util.ArrayList; | |
import java.util.List; | |
import javax.persistence.EntityManager; | |
/** | |
* Tests basic create, read, update and delete operations. | |
* | |
* @author Pinaki Poddar | |
* | |
*/ | |
public class TestBasic extends SliceTestCase { | |
protected String getPersistenceUnitName() { | |
return "slice"; | |
} | |
public void setUp() throws Exception { | |
super.setUp(PObject.class, Person.class, Address.class, CLEAR_TABLES); | |
} | |
/** | |
* Persist N objects. | |
*/ | |
List<PObject> create(int N) { | |
List<PObject> pcs = new ArrayList<PObject>(); | |
EntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
for (int i = 0; i < N; i++) { | |
PObject pc = new PObject(); | |
pcs.add(pc); | |
em.persist(pc); | |
pc.setValue(i); | |
} | |
em.getTransaction().commit(); | |
em.clear(); | |
return pcs; | |
} | |
/** | |
* Create a single object. | |
*/ | |
PObject create() { | |
return create(1).get(0); | |
} | |
/** | |
* Delete a single object by EntityManager.remove() | |
*/ | |
public void testDelete() { | |
int N = 10; | |
create(N); | |
EntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
int before = count(PObject.class); | |
List all = em.createQuery("SELECT p FROM PObject p").getResultList(); | |
assertFalse(all.isEmpty()); | |
em.remove(all.get(0)); | |
em.getTransaction().commit(); | |
int after = count(PObject.class); | |
assertEquals(before - 1, after); | |
} | |
/** | |
* Delete in bulk by query. | |
*/ | |
public void testBulkDelete() { | |
EntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
int c = count(PObject.class); | |
int d = em.createQuery("DELETE FROM PObject p").executeUpdate(); | |
assertEquals(c, d); | |
em.getTransaction().commit(); | |
c = count(PObject.class); | |
assertEquals(0, c); | |
} | |
/** | |
* Store and find the same object. | |
*/ | |
public void testFind() { | |
PObject pc = create(); | |
int value = pc.getValue(); | |
EntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
PObject pc2 = em.find(PObject.class, pc.getId()); | |
assertNotNull(pc2); | |
assertNotEquals(pc, pc2); | |
assertEquals(pc.getId(), pc2.getId()); | |
assertEquals(value, pc2.getValue()); | |
} | |
public void testPersistIndependentObjects() { | |
int before = count(PObject.class); | |
EntityManager em = emf.createEntityManager(); | |
int N = 2; | |
em.getTransaction().begin(); | |
for (int i = 0; i < N; i++) | |
em.persist(new PObject()); | |
em.getTransaction().commit(); | |
em.clear(); | |
int after = count(PObject.class); | |
assertEquals(before + N, after); | |
} | |
public void testPersistConnectedObjectGraph() { | |
Person p1 = new Person("A"); | |
Person p2 = new Person("B"); | |
Person p3 = new Person("C"); | |
Address a1 = new Address("Rome", 12345); | |
Address a2 = new Address("San Francisco", 23456); | |
Address a3 = new Address("New York", 34567); | |
p1.setAddress(a1); | |
p2.setAddress(a2); | |
p3.setAddress(a3); | |
EntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
em.persist(p1); | |
em.persist(p2); | |
em.persist(p3); | |
em.getTransaction().commit(); | |
em.clear(); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
List<Person> persons = | |
em.createQuery("SELECT p FROM Person p WHERE p.name=?1") | |
.setParameter(1, "A").getResultList(); | |
List<Address> addresses = | |
em.createQuery("SELECT a FROM Address a").getResultList(); | |
for (Address pc : addresses) { | |
assertNotNull(pc.getCity()); | |
assertNotNull(pc.getOwner().getName()); | |
} | |
for (Person pc : persons) { | |
assertNotNull(pc.getName()); | |
assertNotNull(pc.getAddress().getCity()); | |
} | |
em.getTransaction().rollback(); | |
} | |
/** | |
* Merge only works if the distribution policy assigns the correct slice | |
* from which the instance was fetched. | |
*/ | |
public void testMerge() { | |
PObject pc = create(1).get(0); | |
int value = pc.getValue(); | |
pc.setValue(value + 1); | |
assertNotNull(pc); | |
EntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
PObject pc2 = em.merge(pc); | |
em.getTransaction().commit(); | |
em.clear(); | |
assertNotNull(pc2); | |
assertNotEquals(pc, pc2); | |
assertEquals(pc.getId(), pc2.getId()); | |
assertEquals(value + 1, pc2.getValue()); | |
} | |
} |