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