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