You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2008/08/08 10:59:12 UTC
svn commit: r683916 - in
/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta:
ClassMapping.java strats/RelationFieldStrategy.java
Author: ppoddar
Date: Fri Aug 8 01:59:12 2008
New Revision: 683916
URL: http://svn.apache.org/viewvc?rev=683916&view=rev
Log:
OPENJPA-677: Make a judgement whether reading discrimnator value from the result makes sense in a context
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java?rev=683916&r1=683915&r2=683916&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java Fri Aug 8 01:59:12 2008
@@ -175,6 +175,7 @@
FieldMapping fm;
Joinable join;
int pkIdx;
+ boolean canReadDiscriminator = true;
for (int i = 0; i < pks.length; i++) {
// we know that all pk column join mappings use primary key fields,
// cause this mapping uses the oid as its primary key (we recursed
@@ -182,7 +183,7 @@
join = assertJoinable(pks[i]);
fm = getFieldMapping(join.getFieldIndex());
pkIdx = fm.getPrimaryKeyIndex();
-
+ canReadDiscriminator &= isSelfReference(fk, join.getColumns());
// could have already set value with previous multi-column joinable
if (vals[pkIdx] == null) {
res.startDataRequest(fm);
@@ -197,8 +198,13 @@
// the oid data is loaded by the base type, but if discriminator data
// is present, make sure to use it to construct the actual oid instance
// so that we get the correct app id class, etc
+
+ // Discriminator refers to the row but the vals[] may hold data that
+ // refer to another row. Then there is little point reading the disc
+ // value
+
ClassMapping dcls = cls;
- if (subs) {
+ if (subs && canReadDiscriminator) {
res.startDataRequest(cls.getDiscriminator());
try {
Class dtype = cls.getDiscriminator().getClass(store, cls, res);
@@ -217,6 +223,15 @@
}
return oid;
}
+
+ boolean isSelfReference(ForeignKey fk, Column[] cols) {
+ if (fk == null)
+ return true;
+ for (Column col : cols)
+ if (fk.getColumn(col) != col)
+ return false;
+ return true;
+ }
/**
* Return the given column value(s) for the given object. The given
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java?rev=683916&r1=683915&r2=683916&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java Fri Aug 8 01:59:12 2008
@@ -556,10 +556,8 @@
ClassMapping relMapping = field.getTypeMapping();
Object oid = null;
if (relMapping.isMapped()) {
- boolean subs = field.getPolymorphic() != ValueMapping.POLY_FALSE
- && relMapping.getPCSubclasses().length > 0;
oid = relMapping.getObjectId(store, res, field.getForeignKey(),
- subs, null);
+ field.getPolymorphic() != ValueMapping.POLY_FALSE, null);
} else {
Column[] cols = field.getColumns();
if (relMapping.getIdentityType() == ClassMapping.ID_DATASTORE) {