blob: 6e86aa208ac24d57aa7c37bc16c3f91a12d2a9e4 [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.jdbc.kernel;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.EntityManager;
import org.apache.openjpa.persistence.test.SQLListenerTestCase;
/**
* Test that insert order is preserved when using the ConstraintUpdateManager
* for entities which are not annotated with ForeignKey constraints.
*/
public class TestInsertOrder extends SQLListenerTestCase {
private String empTableName;
private String taskTableName;
private String storyTableName;
public void setUp() {
setUp(Employee.class, Task.class, Story.class);
empTableName = getMapping(Employee.class).getTable().getFullName();
taskTableName = getMapping(Task.class).getTable().getFullName();
storyTableName = getMapping(Story.class).getTable().getFullName();
}
/**
* <P>Persist an Employee entity and allow the cascade to insert the children.
* The inserts should be executed in this order, Employee, Task, Story.
* </P>
*
* <P>
* Originally this test would pass in some scenarios. I believe the order
* relied on the hashcode of the underlying entities.
* </P>
*/
public void testCascadePersist() {
Employee e = newTree(10);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(e);
em.getTransaction().commit();
em.close();
assertSQLOrder("INSERT INTO " + empTableName + ".*", "INSERT INTO "
+ taskTableName + ".*", "INSERT INTO " + storyTableName + ".*");
}
/**
* Merge an Employee entity and allow the cascade to insert the children.
* The inserts should be executed in this order, Employee, Task, Story.
*/
public void testCascadeMerge() {
Employee e = newTree(11);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.merge(e);
em.getTransaction().commit();
em.close();
assertSQLOrder("INSERT INTO " + empTableName + ".*", "INSERT INTO "
+ taskTableName + ".*", "INSERT INTO " + storyTableName + ".*");
}
/**
* Helper to create a tree of entities
*
* @param id
* ID for the entities.
* @return an unmanaged Employee instance with the appropriate relationships
* set.
*/
private Employee newTree(int id) {
Employee e = new Employee();
e.setId(id);
Task t = new Task();
t.setId(id);
Story s = new Story();
s.setId(id);
Collection<Task> tasks = new ArrayList<Task>();
tasks.add(t);
Collection<Story> stories = new ArrayList<Story>();
stories.add(s);
e.setTasks(tasks);
t.setEmployee(e);
t.setStories(stories);
s.setTask(t);
return e;
}
}