Hi Andy,

it's done. Your patch + updated test cases
now in CVS.
Thanks for contribution.

regards,
Armin


On Thu, 16 Oct 2003 11:50:31 -0400, Andy Malakov <[EMAIL PROTECTED]> wrote:


Hello All,

It looks OJB 1.0RC4 does not support collections in nested object, when nested object belongs to parent class.

Example:

Java:
===

class ConfigEntry { ... }

class Config {
    Collection configEntries;
     ...
}

class Project {
    Config config;
     ...
}

class ExtendedProject extends Project { ... }

repository.xml:
==========
   <class-descriptor
      class="ExtendedProject"
      table="EXT_PROJECT"
   >
      <collection-descriptor
         name="config::configEntries"
         element-class-ref="ConfigEntry "
      >
         <inverse-foreignkey field-ref="projectFk"/>
      </collection-descriptor>
     ...
  </class-descriptor>

An attempt to load ExtendedProject causes the following exception:

java.lang.NoSuchFieldException: config::configEntries
at java.lang.Class.getDeclaredField(Class.java:1208)
at org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.getFieldRecursive(AbstractPersistentField.java:199)
at org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.getFieldRecursive(AbstractPersistentField.java:212)
at org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.getFieldRecursive(AbstractPersistentField.java:212)
at org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.computeField(AbstractPersistentField.java:181)
at org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.getField(AbstractPersistentField.java:167)
at org.apache.ojb.broker.metadata.fieldaccess.AbstractPersistentField.getType(AbstractPersistentField.java:355)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveCollection(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveCollections(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getDBObject(Unknown Source)
at org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByIdentity(Unknown Source)
at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown Source)
at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByIdentity(Unknown Source)


This issue can be fixed in AbstractPersistentField:


/** * Tries to compute a Field object using getFieldRecursive. * @throws MetadataException if there is an error computing the field * ( No Field was found into the class hierarchy) */ private Field computeField(Class c, String fieldname) { try { Field f; if (isNestedField()) // *NEW* f = getNestedRecursiveField(c, fieldname); // *NEW* else f = getFieldRecursive(c, fieldname);

if (makeAccessible()) f.setAccessible(true); // allow access to private members
return f;
}
catch (NoSuchFieldException e)
{
throw new MetadataException("Can't find member " + fieldname + " in " + c.getName(), e);
}
}


// *NEW*
private Field getNestedRecursiveField (Class c, String fieldName)
throws NoSuchFieldException
{
Field result = null;
int index = fieldName.indexOf(PATH_TOKEN);
if (index >= 0)
{
String pathName = fieldName.substring(0, index);
Field path = getFieldRecursive (c, pathName); // assert(path != null);
result = getNestedRecursiveField (path.getType(), fieldName.substring(index + PATH_TOKEN.length()));
} else {
result = getFieldRecursive (c, fieldName);
}
return result;
}


Thanks,
Andy




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to