You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by dw...@apache.org on 2009/09/14 17:42:04 UTC

svn commit: r814706 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/

Author: dwoods
Date: Mon Sep 14 15:42:03 2009
New Revision: 814706

URL: http://svn.apache.org/viewvc?rev=814706&view=rev
Log:
OPENJPA-1227 SQL generation error when using data cache.  Patch and testcase contributed by David Minor.

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java   (with props)
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java?rev=814706&r1=814705&r2=814706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java Mon Sep 14 15:42:03 2009
@@ -1283,6 +1283,19 @@
             }
         }
 
+        // in certain circumstances force join to superclass table to avoid
+        // SQL generation error.
+        if ( eagerToMany != null && pseld < 0 && seld > 0 && !joined
+                && parent != null ) {
+            FieldMapping[] pfms = parent.getDefinedFieldMappings();
+            for (int i = 0; i < pfms.length; i++) {
+                if (pfms[i] == eagerToMany ) {
+                    pseld = 0;
+                    break;
+                }
+            }
+        }
+        
         // join to parent table if the parent / any ancestors have selected
         // anything
         if (!joined && pseld >= 0 && parent.getTable() != mapping.getTable())
@@ -1621,3 +1634,4 @@
         }
     }
 }
+

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java?rev=814706&r1=814705&r2=814706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java Mon Sep 14 15:42:03 2009
@@ -34,10 +34,20 @@
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 
+import org.apache.openjpa.persistence.FetchAttribute;
+import org.apache.openjpa.persistence.FetchGroup;
+import org.apache.openjpa.persistence.FetchGroups;
+
 
 @Entity
 @Inheritance(strategy = InheritanceType.JOINED)
 @DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING)
+@FetchGroups(
+    {
+        @FetchGroup(name="nothing", attributes={}),
+        @FetchGroup(name="children", attributes={@FetchAttribute(name="children")})
+    }
+)
 public abstract class InheritanceHierarchyAbstract implements Serializable {
 
     @Id
@@ -74,3 +84,4 @@
 	}
 
 }
+

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java?rev=814706&r1=814705&r2=814706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java Mon Sep 14 15:42:03 2009
@@ -34,10 +34,14 @@
 import javax.persistence.MapKey;
 import javax.persistence.OneToMany;
 
+import org.apache.openjpa.persistence.FetchAttribute;
+import org.apache.openjpa.persistence.FetchGroup;
+
 
 @Entity
 @Inheritance(strategy = InheritanceType.JOINED)
 @DiscriminatorValue("concrete")
+@FetchGroup(name="value", attributes={@FetchAttribute(name="value")})
 public class InheritanceHierarchyConcrete extends InheritanceHierarchyAbstract implements Serializable {
 
 	@Basic
@@ -52,3 +56,4 @@
 	}
 
 }
+

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java?rev=814706&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java Mon Sep 14 15:42:03 2009
@@ -0,0 +1,89 @@
+/*
+ * 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.persistence.relations;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import org.apache.openjpa.meta.FetchGroup;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.PersistenceException;
+import org.apache.openjpa.persistence.datacache.common.apps.FlushDataCacheObject;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestJoinedInheritanceHierarchyWithCache
+    extends SingleEMFTestCase {
+
+    public void setUp() {
+    	super.setUp(CLEAR_TABLES, InheritanceHierarchyConcrete.class, 
+    			InheritanceHierarchyAbstract.class, FlushDataCacheObject.class,
+    			"openjpa.DataCache", "true(CacheSize=1, SoftReferenceSize=0)",
+    			"openjpa.RemoteCommitProvider", "sjvm");
+    }
+
+    public void testCacheSqlGeneration() throws PersistenceException {
+    	
+		InheritanceHierarchyConcrete parent = new InheritanceHierarchyConcrete();
+		InheritanceHierarchyConcrete child = new InheritanceHierarchyConcrete();
+		parent.setValue(42);
+		child.setValue(21);
+		Set<InheritanceHierarchyAbstract> children = new HashSet<InheritanceHierarchyAbstract>();
+		children.add(child);
+		parent.setChildren(children);
+		child.setParent(parent);
+
+    	
+    	OpenJPAEntityManager em = emf.createEntityManager();
+    	em.getTransaction().begin();
+		em.persist(parent);
+    	em.getTransaction().commit();
+    	em.close();
+    	
+    	long id = parent.getId();
+
+    	em = emf.createEntityManager();
+    	em.getFetchPlan().removeFetchGroup(FetchGroup.NAME_DEFAULT)
+			.addFetchGroup("children").addFetchGroup("value");
+    	em.createQuery(
+    			"SELECT p FROM InheritanceHierarchyConcrete p WHERE p.id=" + id
+    			).getResultList().get(0);
+    	em.close();
+    	
+    	em = emf.createEntityManager();
+    	em.getFetchPlan().removeFetchGroup(FetchGroup.NAME_DEFAULT)
+    		.addFetchGroup("nothing").addFetchGroup("value");
+    	em.createQuery(
+    			"SELECT p FROM InheritanceHierarchyConcrete p WHERE p.id=" + id
+    			).getResultList().get(0);
+    	em.close();
+
+    	em = emf.createEntityManager();
+    	em.getFetchPlan().removeFetchGroup(FetchGroup.NAME_DEFAULT)
+			.addFetchGroup("children").addFetchGroup("value");
+    	em.createQuery(
+    			"SELECT p FROM InheritanceHierarchyConcrete p WHERE p.id=" + id
+    			).getResultList().get(0);
+    	em.close();
+
+    }
+}
+

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java
------------------------------------------------------------------------------
    svn:eol-style = native