/*
* 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.datacache;
import javax.persistence.EntityManager;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* Defined ordering is only applied when the collection is loaded from the
* datastore. It is not maintained by Openjpa as you modify the collection in
* memory. Openjpa invalid data cache in case the persistence operation may
* result cache in wrong order. This test suite tests various cases for the
* above problem.
*/
public class TestOrderbyInDataCache extends SingleEMFTestCase {
private long pid;
public void setUp() {
setUp("openjpa.DataCache", "true",
"openjpa.RemoteCommitProvider", "sjvm",
OrderedOneManyParent.class,
OrderedOneManyChild.class, CLEAR_TABLES);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
OrderedOneManyParent prt = new OrderedOneManyParent();
prt.setName("Maria");
em.persist(prt);
//insert child in reverse order
for (int i = 4; i > 1; i--) {
OrderedOneManyChild child = new OrderedOneManyChild();
child.setId(i);
child.setName("child" + i);
child.setParent(prt);
prt.getChildren().add(child);
em.persist(child);
}
em.getTransaction().commit();
pid = prt.getId();
em.close();
}
/**
* Test if child list is in order after new child list is added in setup().
*
*/
public void testGetChildList(){
EntityManager em = emf.createEntityManager();
OrderedOneManyParent prt = em.find(OrderedOneManyParent.class, pid);
assertEquals(3, prt.getChildren().size());
//the order should be "child2", "child3", "child4"
for (int i = 1; i < 4; i++) {
assertEquals("child" + (i + 1), prt.getChildren().
get(i-1).getName());
}
em.close();
}
public void testInsertChild() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
OrderedOneManyParent prt = em.find(OrderedOneManyParent.class, pid);
OrderedOneManyChild child = new OrderedOneManyChild();
child.setId(1);
child.setName("child1");
child.setParent(prt);
prt.getChildren().add(child);
em.persist(child);
em.getTransaction().commit();
em.close();
//obtain object in new persistence context
em = emf.createEntityManager();
prt = em.find(OrderedOneManyParent.class, pid);
assertEquals(4, prt.getChildren().size());
//the order should be "child1", "child2", "child3", "child4"
for (int i = 1; i < 5; i++) {
assertEquals("child" + i, prt.getChildren().
get(i-1).getName());
}
em.close();
}
public void testUpdateChildName() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
OrderedOneManyChild child = em.find(OrderedOneManyChild.class, 4);
child.setName("child1");
em.persist(child);
em.getTransaction().commit();
OrderedOneManyParent prt = em.find(OrderedOneManyParent.class, pid);
assertEquals(3, prt.getChildren().size());
//the order should be "child1", "child2", "child3"
for (int i = 1; i < 4; i++) {
assertEquals("child" + i, prt.getChildren().
get(i-1).getName());
}
em.close();
}
}