| /******************************************************************************* |
| * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 |
| * which accompanies this distribution. |
| * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html |
| * and the Eclipse Distribution License is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * Contributors: |
| * Oracle - initial impl |
| ******************************************************************************/ |
| package example; |
| |
| import java.math.BigDecimal; |
| import java.util.List; |
| |
| import javax.persistence.EntityManager; |
| import javax.persistence.EntityManagerFactory; |
| import javax.persistence.Persistence; |
| import javax.persistence.Query; |
| |
| import model.*; |
| |
| /** |
| * Simulates a migration of 100,000 objects from MySQL to Oracle. |
| * @author James Sutherland |
| */ |
| public class Test { |
| |
| public static int CUSTOMERS = 1000; |
| public static int ORDERS = 10; |
| public static int ORDERLINES = 10; |
| |
| public static void main(String[] args) throws Exception { |
| try { |
| Test test = new Test(); |
| test.setupDatabase(); |
| test.migrateDatabase(); |
| test.verifyMigration(); |
| } catch (Exception error) { |
| error.printStackTrace(); |
| } |
| } |
| |
| /** |
| * Setup the original database that is to be migrated (normally this would be an existing database). |
| * This is not part of the test. |
| */ |
| public void setupDatabase() { |
| System.out.println("Setting up database."); |
| EntityManagerFactory emf = Persistence.createEntityManagerFactory("order-old"); |
| EntityManager em = emf.createEntityManager(); |
| // Check if database exists. |
| boolean recreate = false; |
| long count = (Long)em.createQuery("Select count(c) from Customer c").getSingleResult(); |
| long count2 = (Long)em.createQuery("Select count(o) from Order o").getSingleResult(); |
| if ((count != CUSTOMERS) || (count2 != (ORDERS * CUSTOMERS))) { |
| recreate = true; |
| em.getTransaction().begin(); |
| em.createQuery("Delete from OrderLine ol").executeUpdate(); |
| em.createQuery("Delete from Order o").executeUpdate(); |
| em.createQuery("Delete from Customer c").executeUpdate(); |
| em.getTransaction().commit(); |
| } |
| if (recreate) { |
| // Create 100 customers with 100 orders with 10 order lines ~= 100,000 objects. |
| for (int index = 0; index < CUSTOMERS; index++) { |
| em.getTransaction().begin(); |
| Customer customer = new Customer(); |
| customer.setName("Cust#" + index); |
| for (int index2 = 0; index2 < ORDERS; index2++) { |
| Order order = new Order(); |
| order.setDescription("Order#" + (index * ORDERS + index2)); |
| order.setCustomer(customer); |
| for (int index3 = 0; index3 < ORDERLINES; index3++) { |
| OrderLine orderLine = new OrderLine(); |
| orderLine.setDescription("OrderLine#" + ((index * ORDERS) + (index2 * ORDERLINES) + index3)); |
| orderLine.setLineNumber(index3); |
| orderLine.setCost(new BigDecimal(index3 * 100 + index2 + 5.99)); |
| order.addOrderLine(orderLine); |
| } |
| em.persist(order); |
| } |
| em.getTransaction().commit(); |
| em.clear(); |
| } |
| } |
| emf.close(); |
| emf = Persistence.createEntityManagerFactory("order"); |
| em = emf.createEntityManager(); |
| // Clear any data from new database from previous runs. |
| em.getTransaction().begin(); |
| em.createQuery("Delete from OrderLine ol").executeUpdate(); |
| em.createQuery("Delete from Order o").executeUpdate(); |
| em.createQuery("Delete from Customer c").executeUpdate(); |
| em.getTransaction().commit(); |
| em.close(); |
| emf.close(); |
| System.out.println("Setup complete."); |
| } |
| |
| public void migrateDatabase() { |
| EntityManagerFactory emf = Persistence.createEntityManagerFactory("order"); |
| EntityManager em = emf.createEntityManager(); |
| EntityManagerFactory emfOld = Persistence.createEntityManagerFactory("order-old"); |
| EntityManager emOld = emfOld.createEntityManager(); |
| System.out.println("Migrating database."); |
| long start = System.currentTimeMillis(); |
| Query query = emOld.createQuery("Select o from Order o"); |
| List<Order> orders = query.getResultList(); |
| em.getTransaction().begin(); |
| // Reset old Ids, so they are assigned from the new database. |
| for (Order order : orders) { |
| order.setId(0); |
| order.getCustomer().setId(0); |
| } |
| for (Order order : orders) { |
| em.persist(order); |
| for (OrderLine orderLine : order.getOrderLines()) { |
| em.persist(orderLine); |
| } |
| } |
| em.getTransaction().commit(); |
| em.close(); |
| emOld.close(); |
| System.out.println("Migration complete."); |
| long end = System.currentTimeMillis(); |
| System.out.println("Total time:" + (end - start)); |
| emf.close(); |
| emfOld.close(); |
| } |
| |
| /** |
| * Verify the correct number of objects were migrated. |
| */ |
| public void verifyMigration() { |
| System.out.println("Verifying migration."); |
| EntityManagerFactory emf = Persistence.createEntityManagerFactory("order"); |
| EntityManager em = emf.createEntityManager(); |
| long count = (Long)em.createQuery("Select count(c) from Customer c").getSingleResult(); |
| if (count == CUSTOMERS) { |
| System.out.println("Migrated " + count + " customers."); |
| } else { |
| System.out.println("Migration failed, expected " + CUSTOMERS + " customers, migrated " + count); |
| } |
| long count2 = (Long)em.createQuery("Select count(o) from Order o").getSingleResult(); |
| if (count2 == (CUSTOMERS * ORDERS)) { |
| System.out.println("Migrated " + count2 + " orders."); |
| } else { |
| System.out.println("Migration failed, expected " + (CUSTOMERS * ORDERS) + " orders, migrated " + count2); |
| } |
| long count3 = (Long)em.createQuery("Select count(ol) from OrderLine ol").getSingleResult(); |
| if (count3 == (CUSTOMERS * ORDERS * ORDERLINES)) { |
| System.out.println("Migrated " + count3 + " order lines."); |
| } else { |
| System.out.println("Migration failed, expected " + (CUSTOMERS * ORDERS * ORDERLINES) + " order lines, migrated " + count3); |
| } |
| } |
| } |