From 416b8d3ccb65f8ecf612513489ed78e5cebe8641 Mon Sep 17 00:00:00 2001 From: Donald Woods Date: Mon, 14 Sep 2009 15:42:03 +0000 Subject: [PATCH] OPENJPA-1227 SQL generation error when using data cache. Patch and testcase contributed by David Minor. git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@814706 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/jdbc/kernel/JDBCStoreManager.java | 14 +++ .../InheritanceHierarchyAbstract.java | 11 +++ .../InheritanceHierarchyConcrete.java | 5 ++ ...stJoinedInheritanceHierarchyWithCache.java | 89 +++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java index c068ca153..e6cafc951 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java @@ -1283,6 +1283,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()) @@ -1621,3 +1634,4 @@ public class JDBCStoreManager } } } + diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java index 24740cb37..39c6c2d39 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyAbstract.java @@ -34,10 +34,20 @@ 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 @@ -74,3 +84,4 @@ public abstract class InheritanceHierarchyAbstract implements Serializable { } } + diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java index cd616e9af..a112b0007 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/InheritanceHierarchyConcrete.java @@ -34,10 +34,14 @@ 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 @@ -52,3 +56,4 @@ public class InheritanceHierarchyConcrete extends InheritanceHierarchyAbstract i } } + diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java new file mode 100644 index 000000000..af4ca7d24 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestJoinedInheritanceHierarchyWithCache.java @@ -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 children = new HashSet(); + 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(); + + } +} +