Joseph Senecal | 20 Jul 2012 02:07
Picon
Favicon

Generated primary keys are being truncated

We are using Cayenne 3.1 M3 in production. We have just discovered that the primary keys being generated are
being truncated to fit an int.

The sequence returns numbers like 5224748590. I've confirmed this by logging the return value of LongPkRange.getNextPrimaryKey.

But the inserts are using PKs like 929781294. 5224748590 - 2^32 = 929781294. Something is stripping off the
high order bits of the primary keys. 

I've checked my model, there the primary key is Defined as Number(15) in the database, but it isn't defined
as an attribute at all, so I can't specify the Java class to use for it.

Anyone have any suggestions?

Aristedes Maniatis | 20 Jul 2012 02:15

Re: Generated primary keys are being truncated

Look at the columns widths of the AUTO_PK table?

Ari

On 20/07/12 10:07am, Joseph Senecal wrote:
> We are using Cayenne 3.1 M3 in production. We have just discovered that the primary keys being generated
are being truncated to fit an int.
>
> The sequence returns numbers like 5224748590. I've confirmed this by logging the return value of LongPkRange.getNextPrimaryKey.
>
> But the inserts are using PKs like 929781294. 5224748590 - 2^32 = 929781294. Something is stripping off
the high order bits of the primary keys.
>
> I've checked my model, there the primary key is Defined as Number(15) in the database, but it isn't defined
as an attribute at all, so I can't specify the Java class to use for it.
>
> Anyone have any suggestions?
>

--

-- 
-------------------------->
Aristedes Maniatis
GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A

Joseph Senecal | 20 Jul 2012 02:19
Picon
Favicon

Re: Generated primary keys are being truncated

We're using Oracle and sequences, not an AUTO_PK table to generate the keys. I've added logging into the
custom code that pulls sequences, and the values are right at that point. But when I look at the code that
calls that, I find right after the call:
        if (pk.getType() == Types.BIGINT) {
            return Long.valueOf(value);
        }
        else {
            // leaving it up to the user to ensure that PK does not exceed max int...
            return Integer.valueOf((int) value);
        }

How do I specify a primary key type to be BIGINT? Would anything break if I changed my copy of this code to
always return a Long instead of an Integer?

Joe

On Jul 19, 2012, at 5:15 PM, Aristedes Maniatis wrote:

> Look at the columns widths of the AUTO_PK table?
> 
> Ari
> 
> On 20/07/12 10:07am, Joseph Senecal wrote:
>> We are using Cayenne 3.1 M3 in production. We have just discovered that the primary keys being generated
are being truncated to fit an int.
>> 
>> The sequence returns numbers like 5224748590. I've confirmed this by logging the return value of LongPkRange.getNextPrimaryKey.
>> 
>> But the inserts are using PKs like 929781294. 5224748590 - 2^32 = 929781294. Something is stripping off
the high order bits of the primary keys.
(Continue reading)

Andrus Adamchik | 20 Jul 2012 15:16
Favicon

Re: Generated primary keys are being truncated

> How do I specify a primary key type to be BIGINT? 

This is exactly what you need to do - in the Modeler change the PK column type of DbEntity to BIGINT from INT.

Andrus

On Jul 20, 2012, at 3:19 AM, Joseph Senecal wrote:

> We're using Oracle and sequences, not an AUTO_PK table to generate the keys. I've added logging into the
custom code that pulls sequences, and the values are right at that point. But when I look at the code that
calls that, I find right after the call:
>        if (pk.getType() == Types.BIGINT) {
>            return Long.valueOf(value);
>        }
>        else {
>            // leaving it up to the user to ensure that PK does not exceed max int...
>            return Integer.valueOf((int) value);
>        }
> 
> How do I specify a primary key type to be BIGINT? Would anything break if I changed my copy of this code to
always return a Long instead of an Integer?
> 
> Joe
> 
> On Jul 19, 2012, at 5:15 PM, Aristedes Maniatis wrote:
> 
>> Look at the columns widths of the AUTO_PK table?
>> 
>> Ari
>> 
(Continue reading)

Joseph Senecal | 20 Jul 2012 18:18
Picon
Favicon

Re: Generated primary keys are being truncated

The type in the PK column is NUMERIC with a size of 15 digits. This reflects what is in the Oracle database. But
since NUMERIC isn't BIGINT, the key is being truncated to Integer. Is that expected behavior or have I
found a bug?

This is no longer an urgent issue. I was already overriding OraclePkGenerator, I simple changed the code to
always return a LONG (all of our primary keys are NUMERIC and at least 10 digits).

Joe

On Jul 20, 2012, at 6:16 AM, Andrus Adamchik wrote:

>> How do I specify a primary key type to be BIGINT? 
> 
> 
> This is exactly what you need to do - in the Modeler change the PK column type of DbEntity to BIGINT from INT.
> 
> Andrus
> 
> 
> 
> On Jul 20, 2012, at 3:19 AM, Joseph Senecal wrote:
> 
>> We're using Oracle and sequences, not an AUTO_PK table to generate the keys. I've added logging into the
custom code that pulls sequences, and the values are right at that point. But when I look at the code that
calls that, I find right after the call:
>>       if (pk.getType() == Types.BIGINT) {
>>           return Long.valueOf(value);
>>       }
>>       else {
>>           // leaving it up to the user to ensure that PK does not exceed max int...
(Continue reading)

Andrus Adamchik | 20 Jul 2012 18:28
Favicon

Re: Generated primary keys are being truncated


> The type in the PK column is NUMERIC with a size of 15 digits. This reflects what is in the Oracle database.
But since NUMERIC isn't BIGINT, the key is being truncated to Integer. Is that expected behavior or have I
found a bug?

Sure it is NUMERIC in DB, but you can still map it in Cayenne model as BIGINT. I am fairly certain it will work correctly.

Having said that, we should probably add some logic to ensure that NUMERIC(N) is converted to Long if N > (?)

Andrus

On Jul 20, 2012, at 7:18 PM, Joseph Senecal wrote:

> The type in the PK column is NUMERIC with a size of 15 digits. This reflects what is in the Oracle database.
But since NUMERIC isn't BIGINT, the key is being truncated to Integer. Is that expected behavior or have I
found a bug?
> 
> This is no longer an urgent issue. I was already overriding OraclePkGenerator, I simple changed the code
to always return a LONG (all of our primary keys are NUMERIC and at least 10 digits).
> 
> Joe
> 
> On Jul 20, 2012, at 6:16 AM, Andrus Adamchik wrote:
> 
>>> How do I specify a primary key type to be BIGINT? 
>> 
>> 
>> This is exactly what you need to do - in the Modeler change the PK column type of DbEntity to BIGINT from INT.
>> 
>> Andrus
(Continue reading)


Gmane