Re: Long primary keys

Andrus Adamchik <[email protected]>
Newsgroups gmane.comp.java.cayenne.user
Message-ID <[email protected]>
This still does not invalidate the original question though - why wouldn't Cayenne choose a Long here? 

My suggestion is to map this column as BIGINT in Cayenne, and it will do the right thing.

Andrus


> On Nov 13, 2019, at 4:29 PM, Michael Gentry <[email protected]> wrote:
> 
> Hi Vemund!
> 
> Long.MAX_VALUE is 9,223,372,036,854,775,807.  NUMBER(38) is a lot more
> digits.
> 
> Does your DB really have primary keys that large?  To play Devil's Advocate:
> 
> 9223372036854775807 / 1000 inserts/second / 60 seconds/minute / 60
> minutes/hour / 24 hours/day / 365 days/year = 292,471,208 years before your
> primary keys are exhausted assuming you can actually insert 1000
> records/second non-stop for nearly 300 million years.  If so, you'll need
> to consider a different approach.  Perhaps using BigInteger, although I've
> not personally tried that with Cayenne's mapping so it may not work.  If it
> doesn't, you can try creating a class that will work with Cayenne's mapping
> (right API) which wraps a BigInteger holding the actual value.
> 
> Also, I just looked at the Oracle documentation for the NUMBER data type
> and it says "up to 38 digits of precision" ... perhaps whomever created the
> schema just chose the maximum precision to be safe?
> 
> mrg
> 
> 
> On Wed, Nov 13, 2019 at 6:13 AM Vemund Jakobsen <[email protected]> wrote:
> 
>> Hi,
>> 
>> I'm running a Oracle database and trying to get Cayenne to work when
>> having primary keys that should be mapped to Long in Java. The data type in
>> Oracle is NUMBER(38), but when I create a SelectQuery and use DlpObject
>> object= (DlpObject) Cayenne.objectForQuery(ctx, this); to get the object, I
>> get the exception below. I'm using Cayenne version 4.0.2. Why does Cayenne
>> think that the type is Integer,  and how can the issue be resolved?
>> 
>> 10:59:36,285 WARN  [com.dataloy.rest.exception.CayenneExceptionMapper]
>> (default task-1) : java.sql.SQLException: Numeric Overflow
>>        at
>> oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:4136)
>> [ojdbc8.jar:12.2.0.1.0]
>>        at
>> oracle.jdbc.driver.NumberCommonAccessor.getInt(NumberCommonAccessor.java:123)
>> [ojdbc8.jar:12.2.0.1.0]
>>        at
>> oracle.jdbc.driver.GeneratedStatement.getInt(GeneratedStatement.java:197)
>> [ojdbc8.jar:12.2.0.1.0]
>>        at
>> oracle.jdbc.driver.GeneratedScrollableResultSet.getInt(GeneratedScrollableResultSet.java:244)
>> [ojdbc8.jar:12.2.0.1.0]
>>        at
>> org.jboss.jca.adapters.jdbc.WrappedResultSet.getInt(WrappedResultSet.java:1052)
>>        at
>> org.apache.cayenne.access.types.IntegerType.materializeObject(IntegerType.java:38)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.types.IntegerType.materializeObject(IntegerType.java:28)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.jdbc.reader.FullRowReader.readRow(FullRowReader.java:52)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.jdbc.reader.FullRowReader.readRow(FullRowReader.java:32)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.jdbc.JDBCResultIterator.nextRow(JDBCResultIterator.java:104)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.jdbc.JDBCResultIterator.allRows(JDBCResultIterator.java:80)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:138)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:293)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:471)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:72)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomainQueryAction$2.perform(DataDomainQueryAction.java:446)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:87)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.tx.DefaultTransactionManager.performInLocalTransaction(DefaultTransactionManager.java:59)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:52)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:40)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:443)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:564)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.tx.TransactionFilter.onQuery(TransactionFilter.java:49)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.lifecycle.audit.AuditableFilter.onQuery(AuditableFilter.java:80)
>> [cayenne-lifecycle-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.lifecycle.changeset.ChangeSetFilter.onQuery(ChangeSetFilter.java:56)
>> [cayenne-lifecycle-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:556)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:406)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:107)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:94)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:971)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at
>> org.apache.cayenne.access.DataContext.performQuery(DataContext.java:960)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>        at org.apache.cayenne.Cayenne.objectForQuery(Cayenne.java:467)
>> [cayenne-server-4.0.2.jar:4.0.2]
>>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.