OPENJPA-677: Make a judgement whether reading discrimnator value from the result makes sense in a context

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@683916 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Pinaki Poddar 2008-08-08 08:59:12 +00:00
parent 610023adee
commit 237c092ebb
2 changed files with 18 additions and 5 deletions

View File

@ -175,6 +175,7 @@ public class ClassMapping
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 @@ public class ClassMapping
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 @@ public class ClassMapping
// 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);
@ -218,6 +224,15 @@ public class ClassMapping
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
* columns will be primary key columns of this mapping, but may be in

View File

@ -556,10 +556,8 @@ public class RelationFieldStrategy
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) {