/******************************************************************************* * Copyright (c) 2005, 2015 SAP. 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: * SAP - initial API and implementation ******************************************************************************/ package org.eclipse.persistence.testing.tests.wdf.jpa1.foreignkeys; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.HashSet; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import javax.sql.DataSource; import junit.framework.Assert; import org.eclipse.persistence.testing.framework.wdf.ToBeInvestigated; import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Car; import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Department; import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee; import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Project; import org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Cop; import org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Criminal; import org.eclipse.persistence.testing.models.wdf.jpa1.jpql.Informer; import org.eclipse.persistence.testing.models.wdf.jpa1.node.CascadingNode; import org.eclipse.persistence.testing.models.wdf.jpa1.node.CascadingNodeDescription; import org.eclipse.persistence.testing.models.wdf.jpa1.node.Node; import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestForeignKeys extends JPA1Base { private static void execute(final DataSource dataSource, final String stmtText, final boolean ignore) throws SQLException { final Connection connection = dataSource.getConnection(); try { connection.setAutoCommit(true); final Statement statement = connection.createStatement(); try { statement.executeUpdate(stmtText); } catch (SQLException se) { if (!ignore) { throw se; } } finally { statement.close(); } } finally { connection.close(); } } @Before @After public void clean() throws SQLException { deleteRows(getEnvironment().getDataSource()); } private static void deleteRows(DataSource dataSource) throws SQLException { execute(dataSource, "delete from TMP_VEHICLE", true); execute(dataSource, "delete from TMP_PROJECT_DETAILS", true); execute(dataSource, "delete from TMP_EMP_PROJECT", true); execute(dataSource, "delete from TMP_EMP", true); execute(dataSource, "delete from TMP_DEP", true); execute(dataSource, "delete from TMP_PROJECT", true); execute(dataSource, "delete from TMP_NODE", true); execute(dataSource, "delete from TMP_CASC_NODE_DESC", true); execute(dataSource, "delete from TMP_CASC_NODE", true); execute(dataSource, "delete from TMP_COP_TMP_CRIMINAL", true); execute(dataSource, "delete from TMP_CRIMINAL_TMP_CRIMINAL", true); execute(dataSource, "delete from TMP_COP_TMP_INFORMER", true); execute(dataSource, "delete from TMP_INFORMER_TMP_COP", true); execute(dataSource, "delete from TMP_INFORMER", true); execute(dataSource, "delete from TMP_CRIMINAL", true); execute(dataSource, "delete from TMP_COP", true); } @Test public void testFKBasic() { final EntityManager em = getEnvironment().getEntityManager(); try { em.getTransaction().begin(); Department dep = new Department(1, "Kornfeld"); Employee emp = new Employee(105, "Solarfried", "Sonnenblume", dep); em.persist(dep); em.persist(emp); em.flush(); em.remove(emp); em.remove(dep); em.getTransaction().commit(); } finally { closeEntityManager(em); } } // foreignKeys on jointable(employee_project) and secondary // table(project_details) @Test public void testRelationNM() { final EntityManager em = getEnvironment().getEntityManager(); try { em.getTransaction().begin(); Employee emp = new Employee(1, "first", "last", null); Project pro1 = new Project("foreignKeys"); pro1.setPlannedDays(17); // second tab Set<Project> projects = new HashSet<Project>(); projects.add(pro1); emp.setProjects(projects); em.persist(pro1); em.persist(emp); em.flush(); Project pro2 = new Project("blah"); projects.add(pro2); em.persist(pro2); em.getTransaction().commit(); em.getTransaction().begin(); emp = em.find(Employee.class, 1); Assert.assertEquals("wrong number of Projects", emp.getProjects().size(), 2); projects = emp.getProjects(); pro1 = projects.iterator().next(); pro2 = projects.iterator().next(); projects.remove(pro1); projects.remove(pro2); em.remove(emp); em.remove(pro1); em.remove(pro2); em.getTransaction().commit(); } finally { closeEntityManager(em); } } @Test @ToBeInvestigated // delete not sorted by PK public void testSelfishKey() { final EntityManager em = getEnvironment().getEntityManager(); try { em.getTransaction().begin(); Node parent = new Node(1, null); Node child1 = new Node(2, parent); Node child2 = new Node(3, parent); em.persist(child1); em.persist(child2); em.persist(parent); em.getTransaction().commit(); em.getTransaction().begin(); parent = em.find(Node.class, 1); child1 = em.find(Node.class, 2); child2 = em.find(Node.class, 3); em.remove(parent); em.remove(child1); em.remove(child2); em.getTransaction().commit(); } finally { closeEntityManager(em); } } @Test @ToBeInvestigated public void testFKException() { /* * DatabaseVendor vendor = ConnectionHelper.getDatabaseVendor(dataSource); if (vendor == DatabaseVendor.ORACLE) { * return; // FK check at commit time will be fine } if (vendor == DatabaseVendor.DB2_UDB_AS400) { return; // insert * batch atomic } */ final EntityManager em = getEnvironment().getEntityManager(); boolean caught = false; try { em.getTransaction().begin(); Node eins = new Node(10, null); Node zwei = new Node(20, eins); Node drei = new Node(30, zwei); eins.setParent(drei); em.persist(eins); em.persist(zwei); em.persist(drei); em.getTransaction().commit(); } catch (PersistenceException e) { if (e.getCause().getCause() instanceof SQLException) { caught = true; } } finally { Assert.assertTrue("missing SQLException", caught); closeEntityManager(em); } } @Test @ToBeInvestigated // delete not sorted by PK public void testCriminal() { final EntityManager em = getEnvironment().getEntityManager(); try { em.getTransaction().begin(); Criminal criminal1 = new Criminal(); criminal1.setId(1); Set<Criminal> criminalSet = new HashSet<Criminal>(); criminalSet.add(criminal1); Cop cop1 = new Cop(); cop1.setId(101); Cop cop2 = new Cop(); cop2.setId(202); Set<Cop> copSet = new HashSet<Cop>(); copSet.add(cop1); copSet.add(cop2); cop1.setPartner(cop2); cop1.setAttachedCriminals(criminalSet); criminal1.setAttachedCop(cop1); em.persist(cop1); em.persist(cop2); em.persist(criminal1); em.flush(); em.remove(cop1); em.remove(cop2); em.remove(criminal1); em.getTransaction().commit(); } finally { closeEntityManager(em); } } @Test @ToBeInvestigated public void testCycle() { final EntityManager em = getEnvironment().getEntityManager(); try { em.getTransaction().begin(); Criminal criminal1 = new Criminal(); criminal1.setId(1); Criminal criminal2 = new Criminal(); criminal2.setId(2); Set<Criminal> criminalSet = new HashSet<Criminal>(); criminalSet.add(criminal1); criminalSet.add(criminal2); Informer informer1 = new Informer(); informer1.setId(10); Informer informer2 = new Informer(); informer2.setId(20); Set<Informer> informerSet = new HashSet<Informer>(); informerSet.add(informer1); informerSet.add(informer2); Cop cop1 = new Cop(); cop1.setId(100); Cop cop2 = new Cop(); cop2.setId(200); Set<Cop> copSet = new HashSet<Cop>(); copSet.add(cop1); copSet.add(cop2); cop1.setPartner(cop2); cop1.setAttachedCriminals(criminalSet); cop1.setInformers(informerSet); criminal1.setAttachedCop(cop1); criminal2.setAttachedCop(cop1); informer1.setInformingCops(copSet); informer2.setInformingCops(copSet); em.persist(cop1); em.persist(cop2); em.persist(criminal1); em.persist(criminal2); em.persist(informer1); em.persist(informer2); em.flush(); em.remove(cop1); em.remove(cop2); em.remove(criminal1); em.remove(criminal2); em.remove(informer1); em.remove(informer2); em.getTransaction().commit(); } finally { closeEntityManager(em); } } @Test public void testCascading() { final EntityManager em = getEnvironment().getEntityManager(); try { CascadingNode cNode = new CascadingNode(1, null); CascadingNodeDescription desc = new CascadingNodeDescription(7, cNode, "blah blah"); cNode.setDescription(desc); em.getTransaction().begin(); em.persist(cNode); // cascading desc em.getTransaction().commit(); desc = em.find(CascadingNodeDescription.class, 7); Assert.assertNotNull("missing description", desc); em.getTransaction().begin(); em.remove(cNode); // cascading desc em.getTransaction().commit(); desc = em.find(CascadingNodeDescription.class, 7); Assert.assertEquals("to much description", desc, null); } finally { closeEntityManager(em); } } @Test public void testInsertInRelation() { final EntityManager em = getEnvironment().getEntityManager(); boolean caught = false; try { em.getTransaction().begin(); Department dep = new Department(2, "Kornfeld"); Employee emp = new Employee(106, "Solarfried", "Sonnenblume", dep); em.persist(emp); em.persist(dep); em.getTransaction().commit(); } catch (PersistenceException ex) { caught = true; } finally { Assert.assertEquals("wrong Exception", caught, false); closeEntityManager(em); } } @Test public void testRemoveInRelation() { final EntityManager em = getEnvironment().getEntityManager(); boolean caught = false; try { em.getTransaction().begin(); Department dep = new Department(3, "Kornfeld"); Employee emp = new Employee(107, "Solarfried", "Sonnenblume", dep); em.persist(dep); em.persist(emp); em.flush(); em.remove(dep); em.remove(emp); em.getTransaction().commit(); } catch (PersistenceException ex) { caught = true; } finally { Assert.assertEquals("wrong Exception", caught, false); closeEntityManager(em); } } @Test public void testInsertWithJointable() { final EntityManager em = getEnvironment().getEntityManager(); boolean caught = false; try { Project pro = new Project("WrongInsertWithJointable"); pro.setPlannedDays(18); Employee emp = new Employee(106, "Solarfried", "Sonnenblume", null); Set<Project> projects = new HashSet<Project>(); projects.add(pro); emp.setProjects(projects); em.getTransaction().begin(); em.persist(emp); em.persist(pro); em.getTransaction().commit(); } catch (PersistenceException ex) { caught = true; } finally { Assert.assertEquals("wrong Exception", caught, false); closeEntityManager(em); } } @Test public void testRemoveWithJointable() { final EntityManager em = getEnvironment().getEntityManager(); boolean caught = false; try { Project pro = new Project("testWrongRemoveWithJointable"); pro.setPlannedDays(19); Employee emp = new Employee(107, "Solarfried", "Sonnenblume", null); Set<Project> projects = new HashSet<Project>(); projects.add(pro); emp.setProjects(projects); em.getTransaction().begin(); em.persist(pro); em.persist(emp); em.flush(); em.remove(pro); em.remove(emp); em.getTransaction().commit(); } catch (PersistenceException ex) { caught = true; } finally { Assert.assertEquals("wrong Exception", caught, false); closeEntityManager(em); } } @Test public void testInheritance() { final EntityManager em = getEnvironment().getEntityManager(); try { em.getTransaction().begin(); Employee emp1 = new Employee(321, "Willi", "Wusel", null); Employee emp2 = new Employee(322, "Manni", "Manta", null); Car car1 = new Car(); Car car2 = new Car(); car1.setDriver(emp1); emp2.setAutomobile(car1); car2.setDriver(emp2); em.persist(car1); em.persist(car2); em.persist(emp1); em.persist(emp2); em.flush(); em.remove(car1); em.remove(car2); em.remove(emp1); em.remove(emp2); em.getTransaction().commit(); } finally { closeEntityManager(em); } } }