Author: ppoddar
Date: Mon Mar 16 22:36:50 2009
New Revision: 755031
URL: http://svn.apache.org/viewvc?rev=755031&view=rev
Log:
OPENJPA-981: replicate parent-child relation across slices and not only to root
slice
Added:
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
Modified:
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml
Modified:
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java?rev=755031&r1=755030&r2=755031&view=diff
==============================================================================
---
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
(original)
+++
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/DistributedBrokerImpl.java
Mon Mar 16 22:36:50 2009
@@ -69,7 +69,7 @@
OpCallbacks call) {
OpenJPAStateManager sm = getStateManager(pc);
SliceInfo info = null;
- boolean replicated = SliceImplHelper.isReplicated(sm);
+ boolean replicated = SliceImplHelper.isReplicated(pc,
getConfiguration());
if (getOperatingSet().isEmpty() &&
!SliceImplHelper.isSliceAssigned(sm)) {
info = SliceImplHelper.getSlicesByPolicy(pc,
getConfiguration(),
this);
Added:
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java?rev=755031&view=auto
==============================================================================
---
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
(added)
+++
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedChild.java
Mon Mar 16 22:36:50 2009
@@ -0,0 +1,52 @@
+/*
+ * 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.slice;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.apache.openjpa.persistence.Replicated;
+
+...@entity
+...@replicated
+public class ReplicatedChild {
+ @Id
+ private String name;
+
+ @ManyToOne
+ private ReplicatedParent parent;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ReplicatedParent getParent() {
+ return parent;
+ }
+
+ void setParent(ReplicatedParent parent) {
+ this.parent = parent;
+ }
+
+}
Added:
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java?rev=755031&view=auto
==============================================================================
---
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
(added)
+++
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/ReplicatedParent.java
Mon Mar 16 22:36:50 2009
@@ -0,0 +1,55 @@
+/*
+ * 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.slice;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.*;
+
+import org.apache.openjpa.persistence.Replicated;
+
+...@entity
+...@replicated
+public class ReplicatedParent {
+ @Id
+ private String name;
+
+ @OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
+ private Set<ReplicatedChild> children;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Set<ReplicatedChild> getChildren() {
+ return children;
+ }
+
+ public void addChild(ReplicatedChild child) {
+ if (children == null)
+ children = new HashSet<ReplicatedChild>();
+ children.add(child);
+ child.setParent(this);
+ }
+}
Added:
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java?rev=755031&view=auto
==============================================================================
---
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
(added)
+++
openjpa/trunk/openjpa-slice/src/test/java/org/apache/openjpa/slice/TestReplication.java
Mon Mar 16 22:36:50 2009
@@ -0,0 +1,118 @@
+/*
+ * 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.slice;
+
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
+/**
+ * Tests that parent-child relation both @Repliated are stored in all
replicated
+ * slices.
+ *
+ * <A HREF="https://issues.apache.org/jira/browse/OPENJPA-981">OPENJPA-981</A>
+ *
+ * @author Pinaki Poddar
+ *
+ */
+public class TestReplication extends SingleEMFTestCase {
+ private static int CHILD_COUNT = 3;
+
+ public void setUp() {
+ super.setUp(CLEAR_TABLES);
+ createData();
+ }
+
+ protected String getPersistenceUnitName() {
+ return "replication";
+ }
+
+ void createData() {
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ ReplicatedParent parent = new ReplicatedParent();
+ parent.setName("parent");
+ for (int i = 0; i < CHILD_COUNT; i++) {
+ ReplicatedChild child = new ReplicatedChild();
+ child.setName("child-" + i);
+ parent.addChild(child);
+ }
+ em.persist(parent);
+ em.getTransaction().commit();
+ em.clear();
+ }
+
+ public void testPersistInReplicatedSlices() {
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+
+ String jpql = "select p from ReplicatedParent p where p.name=:name";
+ ReplicatedParent pOne = (ReplicatedParent) em.createQuery(jpql)
+ .setParameter("name", "parent")
+ .setHint(SlicePersistence.HINT_TARGET, "One")
+ .getSingleResult();
+ assertNotNull(pOne);
+
+ assertEquals("[One, Two]", SlicePersistence.getSlice(pOne));
+
+ ReplicatedParent pTwo = (ReplicatedParent) em.createQuery(jpql)
+ .setParameter("name", "parent")
+ .setHint(SlicePersistence.HINT_TARGET, "Two")
+ .getSingleResult();
+ assertNotNull(pTwo);
+ assertEquals("[One, Two]", SlicePersistence.getSlice(pTwo));
+
+ jpql = "select p from ReplicatedChild p where p.name=:name";
+ ReplicatedChild cOne = (ReplicatedChild) em.createQuery(jpql)
+ .setParameter("name", "child-0")
+ .setHint(SlicePersistence.HINT_TARGET, "One")
+ .getSingleResult();
+ assertNotNull(cOne);
+ ReplicatedChild cTwo = (ReplicatedChild) em.createQuery(jpql)
+ .setParameter("name", "child-0")
+ .setHint(SlicePersistence.HINT_TARGET, "Two")
+ .getSingleResult();
+ assertNotNull(cTwo);
+ }
+
+ public void testQuery() {
+ EntityManager em = emf.createEntityManager();
+ String jpql = "select p from ReplicatedParent p where p.name=:name";
+ ReplicatedParent parent = (ReplicatedParent) em.createQuery(jpql)
+ .setParameter("name", "parent")
+ .setHint(SlicePersistence.HINT_TARGET, "One")
+ .getSingleResult();
+ assertNotNull(parent);
+ Set<ReplicatedChild> children = parent.getChildren();
+ assertNotNull(children);
+ assertEquals(CHILD_COUNT, children.size());
+ }
+
+ public void testAggregateQuery() {
+ EntityManager em = emf.createEntityManager();
+ String jpql = "select count(p) from ReplicatedParent p";
+ long pCount = (Long) em.createQuery(jpql).getSingleResult();
+ assertEquals(1, pCount);
+
+ jpql = "select count(p) from ReplicatedChild p";
+ long cCount = (Long) em.createQuery(jpql).getSingleResult();
+ assertEquals(CHILD_COUNT, cCount);
+ }
+
+}
Modified:
openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml?rev=755031&r1=755030&r2=755031&view=diff
==============================================================================
--- openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml
(original)
+++ openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml Mon
Mar 16 22:36:50 2009
@@ -151,4 +151,29 @@
</properties>
</persistence-unit>
+ <persistence-unit name="replication">
+ <class>org.apache.openjpa.slice.ReplicatedParent</class>
+ <class>org.apache.openjpa.slice.ReplicatedChild</class>
+
+ <properties>
+ <property name="openjpa.BrokerFactory" value="slice"/>
+ <property name="openjpa.ConnectionDriverName"
value="org.apache.derby.jdbc.EmbeddedDriver"/>
+
+ <property name="openjpa.slice.Names" value="One,Two"/>
+ <property name="openjpa.slice.DistributionPolicy"
value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
+
+ <property name="openjpa.ConnectionUserName" value=""/>
+ <property name="openjpa.ConnectionPassword" value=""/>
+
+ <property name="openjpa.slice.One.ConnectionURL"
value="jdbc:derby:target/database/openjpa-slice1;create=true"/>
+ <property name="openjpa.slice.Two.ConnectionURL"
value="jdbc:derby:target/database/openjpa-slice2;create=true"/>
+
+ <property name="openjpa.Multithreaded" value="false"/>
+ <property name="openjpa.Log" value="DefaultLevel=INFO, Enhance=TRACE,
SQL=TRACE"/>
+ <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
+ <property name="openjpa.jdbc.MappingDefaults"
value="DefaultMissingInfo=true"/>
+ <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
+ </properties>
+ </persistence-unit>
+
</persistence>