You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/10/10 22:56:32 UTC

svn commit: r462560 - in /incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc: kernel/PagingResultObjectProvider.java meta/strats/RelationToManyInverseKeyFieldStrategy.java sql/SelectImpl.java

Author: awhite
Date: Tue Oct 10 13:56:32 2006
New Revision: 462560

URL: http://svn.apache.org/viewvc?view=rev&rev=462560
Log:
Vertical inheritance with eager fetching fixes.


Modified:
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PagingResultObjectProvider.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PagingResultObjectProvider.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PagingResultObjectProvider.java?view=diff&rev=462560&r1=462559&r2=462560
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PagingResultObjectProvider.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PagingResultObjectProvider.java Tue Oct 10 13:56:32 2006
@@ -383,10 +383,7 @@
                         (_page[j]), store, fetch, res);
             } finally {
                 if (res instanceof Closeable)
-                    try {
-                        ((Closeable) res).close();
-                    } catch (Exception e) {
-                    }
+                    try { ((Closeable) res).close(); } catch (Exception e) {}
             }
         }
     }

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java?view=diff&rev=462560&r1=462559&r2=462560
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java Tue Oct 10 13:56:32 2006
@@ -40,6 +40,7 @@
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.JavaTypes;
 import org.apache.openjpa.util.ChangeTracker;
+import org.apache.openjpa.util.InternalException;
 import org.apache.openjpa.util.MetaDataException;
 import org.apache.openjpa.util.Proxies;
 import org.apache.openjpa.util.Proxy;
@@ -85,8 +86,16 @@
 
     protected Joins join(Joins joins, ClassMapping elem) {
         ValueMapping vm = field.getElementMapping();
-        return joins.joinRelation(field.getName(), vm.getForeignKey(elem), 
-            elem, vm.getSelectSubclasses(), true, true);
+        ForeignKey fk = vm.getForeignKey(elem);
+        ClassMapping owner = field.getDefiningMapping();
+        while (fk.getPrimaryKeyTable() != owner.getTable()) {
+            joins = owner.joinSuperclass(joins, false);
+            owner = owner.getJoinablePCSuperclassMapping(); 
+            if (owner == null)
+                throw new InternalException();
+        }
+        return joins.joinRelation(field.getName(), fk, elem, 
+            vm.getSelectSubclasses(), true, true);
     }
 
     protected Joins joinElementRelation(Joins joins, ClassMapping elem) {

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?view=diff&rev=462560&r1=462559&r2=462560
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Tue Oct 10 13:56:32 2006
@@ -1121,6 +1121,15 @@
             (mapping.getPrimaryKeyColumns(), fk.getPrimaryKeyColumns())) {
             if (joins == null)
                 joins = newJoins();
+            // traverse to foreign key target mapping
+            while (mapping.getTable() != fk.getPrimaryKeyTable()) {
+                if (joins == null)
+                    joins = newJoins();
+                joins = mapping.joinSuperclass(joins, false);
+                mapping = mapping.getJoinablePCSuperclassMapping();
+                if (mapping == null)
+                    throw new InternalException();
+            }
             joins = joins.join(fk, false, false);
             wherePrimaryKey(oid, mapping, joins, store);
             return;
@@ -1159,8 +1168,7 @@
         int count = 0;
         for (int i = 0; i < toCols.length; i++, count++) {
             if (pks == null)
-                val = (oid == null) ? null
-                    : Numbers.valueOf(((Id) oid).getId());
+                val = (oid == null) ? null : Numbers.valueOf(((Id)oid).getId());
             else {
                 // must be app identity; use pk index to get correct pk value
                 join = mapping.assertJoinable(toCols[i]);
@@ -2556,9 +2564,19 @@
             // the joins will all be done in the from select
             boolean createJoin = _sel._from == null;
             Table table1 = null;
+            Table table2 = null;
             int alias1 = -1;
             if (createJoin) {
                 table1 = (inverse) ? fk.getPrimaryKeyTable() : fk.getTable();
+                table2 = (inverse) ? fk.getTable() : fk.getPrimaryKeyTable();
+                if (target != null) {
+                    while (target.getTable() != table2) {
+                        target.joinSuperclass(this, false);
+                        target = target.getJoinablePCSuperclassMapping();
+                        if (target == null)
+                            throw new InternalException();
+                    }
+                }
                 alias1 = _sel.getTableIndex(table1, this, true);
             }
 
@@ -2572,10 +2590,7 @@
             _outer = outer;
 
             if (createJoin) {
-                Table table2 = (inverse) ? fk.getTable()
-                    : fk.getPrimaryKeyTable();
                 int alias2 = _sel.getTableIndex(table2, this, true);
-
                 Join j = new Join(table1, alias1, table2, alias2, fk, inverse);
                 j.setType((outer) ? Join.TYPE_OUTER : Join.TYPE_INNER);