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]
>> 

Reply via email to