Uploaded image for project: 'Cayenne'
  1. Cayenne
  2. CAY-1430

Problems with TINYINT type mapping

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 3.1M1
    • Core Library
    • None
    • MS SQL 2005

    Description

      Today I fount some not nice thing.
      If I am selecting from column with TINYINT type, Cayenne trying to map it to Byte
      But TINYINT can have values from 0 to 255 (which is greater then Byte).

      So I got this:

      java.sql.SQLException: Numeric overflow in conversion of value 160 to type TINYINT.
      at net.sourceforge.jtds.jdbc.Support.convert(Support.java:251)
      at net.sourceforge.jtds.jdbc.JtdsResultSet.getByte(JtdsResultSet.java:648)
      at org.apache.cayenne.access.types.ByteType.materializeObject(ByteType.java:48)
      at org.apache.cayenne.access.jdbc.JDBCResultIterator.readDataRow(JDBCResultIterator.java:291)
      at org.apache.cayenne.access.jdbc.JDBCResultIterator.nextDataRow(JDBCResultIterator.java:145)
      at org.apache.cayenne.access.jdbc.JDBCResultIterator.dataRows(JDBCResultIterator.java:115)
      at org.apache.cayenne.access.jdbc.SQLTemplateAction.processSelectResult(SQLTemplateAction.java:212)
      at org.apache.cayenne.access.jdbc.SQLTemplateAction.execute(SQLTemplateAction.java:153)
      at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:107)
      at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:59)
      at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273)
      at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:301)
      at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:60)
      at org.apache.cayenne.access.DataDomainQueryAction$1.transform(DataDomainQueryAction.java:273)
      at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:826)
      at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:270)
      at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:110)
      at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:746)
      at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:217)
      at org.apache.cayenne.access.DataContextQueryAction.execute(DataContextQueryAction.java:54)
      at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1395)
      at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:1384)

      My idea is to map TINYINT to Short by default. Because:
      1) Some databases don't support this type
      2) It will handle problem described above
      3) I think in 99% cases you don't need it on side of Java application (almost same with short) or if you need you can easily get it from any Number type.

      Attachments

        Activity

          People

            apparition Evgeny Ryabitskiy
            apparition Evgeny Ryabitskiy
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: