You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by rp...@apache.org on 2011/09/18 09:32:14 UTC
svn commit: r1172209 - in /openjpa/branches/1.1.x:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/
Author: rpalache
Date: Sun Sep 18 07:32:13 2011
New Revision: 1172209
URL: http://svn.apache.org/viewvc?rev=1172209&view=rev
Log:
OPENJPA-1227 SQL generation error when using data cache. Backporting David Minor's changes to 1.1.x.
Added:
openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java
openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java
openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java
Modified:
openjpa/branches/1.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java
Modified: openjpa/branches/1.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java?rev=1172209&r1=1172208&r2=1172209&view=diff
==============================================================================
--- openjpa/branches/1.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (original)
+++ openjpa/branches/1.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java Sun Sep 18 07:32:13 2011
@@ -1146,6 +1146,19 @@ public class JDBCStoreManager
}
}
+ // 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())
Added: openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java?rev=1172209&view=auto
==============================================================================
--- openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java (added)
+++ openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java Sun Sep 18 07:32:13 2011
@@ -0,0 +1,87 @@
+/*
+ * 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.io.Serializable;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+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
+ @GeneratedValue
+ private long id;
+
+ @ManyToOne
+ @JoinColumn
+ private InheritanceHierarchyAbstract parent;
+
+ @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL,
+ fetch=FetchType.EAGER)
+ private Set<InheritanceHierarchyAbstract> children;
+
+
+ public long getId() {
+ return id;
+ }
+
+ public Set<InheritanceHierarchyAbstract> getChildren() {
+ return this.children;
+ }
+
+ public void setChildren(Set<InheritanceHierarchyAbstract> children) {
+ this.children = children;
+ }
+
+ public InheritanceHierarchyAbstract getParent() {
+ return this.parent;
+ }
+
+ public void setParent(InheritanceHierarchyAbstract parent) {
+ this.parent = parent;
+ }
+
+}
+
Added: openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java?rev=1172209&view=auto
==============================================================================
--- openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java (added)
+++ openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java Sun Sep 18 07:32:13 2011
@@ -0,0 +1,59 @@
+/*
+ * 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.io.Serializable;
+import java.util.Map;
+import java.util.Set;
+
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+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
+ private int value;
+
+ public int getValue() {
+ return this.value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+}
+
Added: openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java?rev=1172209&view=auto
==============================================================================
--- openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java (added)
+++ openjpa/branches/1.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java Sun Sep 18 07:32:13 2011
@@ -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();
+
+ }
+}
+