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