/******************************************************************************* | |
* Copyright (c) 2005, 2009 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); | |
} | |
} | |
} |