I see... The problem is that 'isGenerated' only applies to 'Db Generated' PK strategy and does not apply to 'Default'. So maybe leave the zero rule for primitives, and check the ObjAttribute (don't know if it is easily available in that place without looking at the code?) for whether the value is mapped as numeric primitive or numeric object?

Andrus


On Aug 2, 2007, at 6:35 PM, Tore Halset wrote:
On Aug 2, 2007, at 14:59 , Andrus Adamchik wrote:

On Aug 2, 2007, at 3:52 PM, Tore Halset wrote:

On Aug 2, 2007, at 14:43 , Tore Halset wrote:

Handling null as 0 can probably lead to other problems as well. Perhaps 'NullNumber extends Number' could be used? Or creating a (empty) Null-interface and then subclass Integer, Long and so on?

The last one would not work as Integer is final.

 - Tore.

I didn't quite understand the proposed solution (aside from the "final" thing). What are we going to use NullNunber for? Could maybe post some code examples?


A better name would be UnsetPrimitiveNumber extending Number and return 0 for all the methods. That way it would be the almost same as new Integer(0), but could be tested for its type.

I have digged a bit down in the POJO code and it looks like this approach will not work. Using reflection on a POJO, java will report the same for an unset int as an int set to 0. So (at least from a reflection point of view) it is the same.

Could we use the DbAttribute.isGenerated flag to determine if the new Integer(0)-value should be handled? Attached is a patch that explain this variant. It looks like this variant passes all the junit tests and also fixes my problem.

 - Tore.
Index: framework/cayenne-jdk1.4-unpublished/src/main/java/org/ apache/cayenne/access/DataDomainInsertBucket.java
===================================================================
--- framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/ cayenne/access/DataDomainInsertBucket.java (revision 562134) +++ framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/ cayenne/access/DataDomainInsertBucket.java (working copy)
@@ -144,8 +144,12 @@
                             .readPropertyDirectly(object);
                     if (value != null) {
- // treat numeric zero values as nulls requiring generation - if (!(value instanceof Number && ((Number) value).intValue() == 0)) { + // POJO/JPA with generated key mapped as a primitive type will + // have a Number with value 0 for a unset value
+                        if (!(supportsGeneratedKeys
+                                && dbAttr.isGenerated()
+ && (value instanceof Number) && ((Number) value)
+                                .intValue() == 0)) {
                             idMap.put(dbAttrName, value);
                             continue;
                         }




Reply via email to