I also totally missed IntegerType in the stack trace. 😕
On Wed, Nov 13, 2019 at 8:42 AM Michael Gentry <[email protected]> wrote: > Hi Andrus, > > I was basing my response due to the "Numeric Overflow" exception, which > sounds like a number too big to fit into a Long. If a BIGINT/BigInteger > will work, that's the easiest solution. > > > On Wed, Nov 13, 2019 at 8:35 AM Andrus Adamchik <[email protected]> > wrote: > >> 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] >> >> >> >>
