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

Reply via email to