Hi all,

I've just upgraded to RC7, and I'm now getting the following error on a 
call to PersistenceBroker.retrieveAllReferences():
java.lang.NullPointerException
                 at 
org.apache.ojb.broker.util.BrokerHelper.representsNull(BrokerHelper.java:260)
                 at 
org.apache.ojb.broker.core.QueryReferenceBroker.hasNullifiedFK(QueryReferenceBroker.java:446)
                 at 
org.apache.ojb.broker.core.QueryReferenceBroker.getReferencedObjectIdentity(QueryReferenceBroker.java:410)
                 at 
org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReference(QueryReferenceBroker.java:334)
                 at 
org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReferences(QueryReferenceBroker.java:396)
                 at 
org.apache.ojb.broker.core.PersistenceBrokerImpl.retrieveAllReferences(PersistenceBrokerImpl.java:1145)
                 at ...

It seems that the problem is in the BrokerHelper.representsNull method. 
The field it is complaining about is "reportNumber", which is an anonymous 
field in the target class.  Here's my class descriptor:
<class-descriptor
    class="ca.richer.domain.OutOfService"
    table="FDJ8CPP"
>
    ... other fields omitted for brevity ...
    <field-descriptor
        name="reportNumber"
        column="J8RZNB"
        jdbc-type="DECIMAL"
        precision="20"
        scale="0"
        access="anonymous"
    >
    </field-descriptor>
    <field-descriptor
        name="lineSequence"
        column="J8R0NB"
        jdbc-type="DECIMAL"
        precision="20"
        scale="0"
        access="anonymous"
    >
    </field-descriptor>
    <reference-descriptor
        name="defectLine"
        class-ref="ca.richer.domain.DefectLine"
    >
        <foreignkey field-ref="reportNumber"/>
        <foreignkey field-ref="lineSequence"/>
    </reference-descriptor>
</class-descriptor>

The problem is that AnonymousPersistentField.getType() always returns 
null, so a NullPointerException is thrown when the BrokerHelper tries to 
determine if this field represents a primitive type.

I would suggest the following patch:
    public boolean representsNull(FieldDescriptor fld, Object aValue)
    {
        if(aValue == null) return true;

        boolean result = false;
        if(((aValue instanceof Number) && (((Number) aValue).longValue() 
== 0)))
        {
                // PATCH STARTS HERE
                PersistentField field = fld.getPersistentField();
                Class type = field.getType();

                // AnonymousPersistentFields will *always* have a null 
type according to the
                // javadoc comments in AnonymousPersistentField.getType()
                if (type == null) {
                        return true;
                }
            result = type.isPrimitive();
                // PATCH ENDS HERE
        }
        else if((aValue instanceof String) && (((String) aValue).length() 
== 0))
        {
            result = fld.isPrimaryKey();
        }
        return result;
    }

Maybe I've overlooked something, but if this method is ever called with an 
anonymous field with a value of 0, it will surely throw a NPE.  Thoughts?

Thanks,
Phil Denis

Reply via email to