/******************************************************************************* * 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.relation; import java.util.HashSet; import java.util.Set; import javax.persistence.EntityManager; import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment; import org.eclipse.persistence.testing.framework.wdf.ToBeInvestigated; import org.eclipse.persistence.testing.models.wdf.jpa1.node.Node; import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base; import org.junit.Test; @SuppressWarnings("unchecked") public class TestNode extends JPA1Base { @Test public void testRoot() { JPAEnvironment env = getEnvironment(); EntityManager em = env.getEntityManager(); try { env.beginTransaction(em); final int rootId = 1; Node root = new Node(rootId, null); em.persist(root); env.commitTransactionAndClear(em); env.beginTransaction(em); Node found = em.find(Node.class, new Integer(rootId)); verify(found != null, "no node found"); verify(found.getParent() == null, "parent not null"); verify(found.getChildren().size() == 0, "unexpected children"); env.rollbackTransactionAndClear(em); } finally { closeEntityManager(em); } } @Test public void testTwoGenerations() { JPAEnvironment env = getEnvironment(); EntityManager em = env.getEntityManager(); try { env.beginTransaction(em); final int rootId = 10; Node root = new Node(rootId, null); final int child1Id = 11; Node child1 = new Node(child1Id, root); Node child2 = new Node(12, root); em.persist(root); em.persist(child1); em.persist(child2); env.commitTransactionAndClear(em); env.beginTransaction(em); Node found = em.find(Node.class, new Integer(rootId)); verify(found != null, "no node found"); verify(found.getParent() == null, "parent not null"); verify(found.getChildren().size() == 2, "unexpected children"); env.rollbackTransactionAndClear(em); env.beginTransaction(em); found = em.find(Node.class, new Integer(child1Id)); verify(found != null, "no node found"); Node parent = found.getParent(); verify(em.contains(parent), "parent not contained in em"); verify(parent != null, "parent is null"); verify(parent.getId() == rootId, "parent has not root id"); verify(parent.getChildren().size() == 2, "unexpected children"); env.rollbackTransactionAndClear(em); } finally { closeEntityManager(em); } } @Test @ToBeInvestigated public void testChangeParent() { JPAEnvironment env = getEnvironment(); EntityManager em = env.getEntityManager(); try { // seed the data model env.beginTransaction(em); final int root1Id = 20; final int root2Id = 21; final int childId = 22; Node root1 = new Node(root1Id, null); Node root2 = new Node(root2Id, null); Node child = new Node(childId, root1); em.persist(root1); em.persist(root2); em.persist(child); env.commitTransactionAndClear(em); // change the parent env.beginTransaction(em); child = em.find(Node.class, new Integer(childId)); Node parent = child.getParent(); root2 = em.find(Node.class, new Integer(root2Id)); Set<Node> children = parent.getChildren(); parent.setChildren(null); child.setParent(root2); root2.setChildren(children); env.commitTransactionAndClear(em); verify(!parent.postUpdateWasCalled(), "root1 was updated but it is not the owning side of the relationship"); verify(!root2.postUpdateWasCalled(), "root2 was updated but it is not the owning side of the relationship"); verify(child.postUpdateWasCalled(), "child was not updated but it is the owning side of the relationship"); // check the relationship env.beginTransaction(em); child = em.find(Node.class, new Integer(childId)); verify(child != null, "child is null"); parent = child.getParent(); verify(parent != null, "parent is null"); root2 = em.find(Node.class, new Integer(root2Id)); verify(root2 == parent, "root2 != parent"); verify(children != null, "children is null"); children = root2.getChildren(); verify(children.contains(child), "child not contained in set of children"); root1 = em.find(Node.class, new Integer(root1Id)); Set children1 = root1.getChildren(); verify(children1 == null || children1.isEmpty(), "children of root1 not null or empty"); env.rollbackTransactionAndClear(em); } finally { closeEntityManager(em); } } @Test public void testCircle() { // in this tree, the root is defined by this.parent = this; JPAEnvironment env = getEnvironment(); EntityManager em = env.getEntityManager(); try { env.beginTransaction(em); final int rootId = 30; Node root = new Node(rootId, null); root.setParent(root); Set<Node> children = new HashSet<Node>(); children.add(root); root.setChildren(children); em.persist(root); env.commitTransactionAndClear(em); env.beginTransaction(em); Node found = em.find(Node.class, new Integer(rootId)); verify(found != null, "no node found"); verify(found.getParent() == found, "parent != root"); verify(found.getChildren().size() == 1, "unexpected children"); env.rollbackTransactionAndClear(em); } finally { closeEntityManager(em); } } }