| /* |
| * 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; |
| } |
| } |