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]
