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);