Re: [JIRA] Commented: (CAY-811) Meaningful identity columns: user provided PK values are ignored

From: Tore Halset (halse..vv.ntnu.no)
Date: Fri Aug 03 2007 - 03:03:05 EDT

  • Next message: Kevin Menard: "RE: NPE in DataDomainQueryAction.java"

    Hello.

    Thank you for looking into the issue. That patch is ok for me.

    Regards,
      - Tore.

    On Aug 2, 2007, at 20:41 , Andrus Adamchik wrote:

    > Finally had a chance to look at the code (instead of suggesting
    > random things :-)). I think a patch like that would work (in fact I
    > tested it with POJO itests and it seems to do the right thing. If
    > there are no objections I can commit it tomorrow.
    >
    > Andrus
    >
    >
    > 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 560823)
    > +++ framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/
    > cayenne/access/DataDomainInsertBucket.java (working copy)
    >.. -144,8 +144,15 @@
    > .readPropertyDirectly(object);
    > if (value != null) {
    > - // treat numeric zero values as nulls
    > requiring generation
    > - if (!(value instanceof Number && ((Number)
    > value).intValue() == 0)) {
    > + Class javaClass = objAttr.getJavaClass();
    > + if (javaClass.isPrimitive()
    > + && value instanceof Number
    > + && ((Number) value).intValue() ==
    > 0) {
    > + // primitive 0 has to be treated as
    > NULL, or otherwise we
    > + // can't generate PK for POJO's
    > + }
    > + else {
    > +
    > idMap.put(dbAttrName, value);
    > continue;
    > }
    >
    >
    >
    > On Aug 2, 2007, at 6:42 PM, Andrus Adamchik wrote:
    >
    >> 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;
    >>> }
    >>>
    >>>
    >>>
    >>
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Fri Aug 03 2007 - 03:04:07 EDT