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