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

JDBC Array type is not supported

    XMLWordPrintableJSON

Details

    • Task
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 4.0.M2
    • None
    • Core Library
    • None

    Description

      At example below I've tried to create -> save -> load object with array field and I expect that loaded object will be equal to original.

      cayenne-project.xml
      <?xml version="1.0" encoding="utf-8"?>
      <domain project-version="7">
      	<map name="datamap"/>
      
      	<node name="datanode" schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy">
      		<map-ref name="datamap"/>
      		<data-source>
      			<driver value="org.h2.Driver"/>
      			<url value="jdbc:h2:~/test"/>
      			<connectionPool min="1" max="1"/>
      			<login/>
      		</data-source>
      	</node>
      </domain>
      
      datamap.map.xml
      <?xml version="1.0" encoding="utf-8"?>
      <data-map xmlns="http://cayenne.apache.org/schema/7/modelMap"
      	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	 xsi:schemaLocation="http://cayenne.apache.org/schema/7/modelMap http://cayenne.apache.org/schema/7/modelMap.xsd"
      	 project-version="7">
      	<property name="defaultPackage" value="com.mycompany.app"/>
      	<db-entity name="Object_With_Array">
      		<db-attribute name="array" type="ARRAY" length="50"/>
      		<db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
      	</db-entity>
      	<obj-entity name="ObjectWithArray" className="com.mycompany.app.ObjectWithArray" dbEntityName="Object_With_Array">
      		<obj-attribute name="array" type="java.lang.Double[]" db-attribute-path="array"/>
      	</obj-entity>
      </data-map>
      
      App.java
      public class App {
          public static void main( String[] args ) throws ClassNotFoundException, SQLException {
              ServerRuntime runtime = new ServerRuntime("cayenne-project.xml");
              DataContext context = (DataContext)runtime.newContext();
      
              ObjectWithArray owa = context.newObject(ObjectWithArray.class);
              owa.setArray(new Double[]{1.0, 2.0});
              context.commitChanges();
      
              List list = context.performQuery(new SelectQuery(ObjectWithArray.class));
              System.out.println(Arrays.toString(((ObjectWithArray) list.get(0)).getArray()));
          }
      }
      
      

      Expected result : console output [1.0, 2.0]
      Actual result : exception

      org.h2.jdbc.JdbcSQLException: Hexadecimal string contains non-hex character: "(aced0005...00000000000)" [90004-185]
      	at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
      	at org.h2.message.DbException.get(DbException.java:179)
      	at org.h2.message.DbException.get(DbException.java:155)
      	at org.h2.util.StringUtils.convertHexToBytes(StringUtils.java:966)
      	at org.h2.value.Value.convertTo(Value.java:864)
      	at org.h2.value.Value.getBytes(Value.java:411)
      	at org.h2.jdbc.JdbcResultSet.getBytes(JdbcResultSet.java:1054)
      	at org.apache.cayenne.access.types.ByteArrayType.materializeObject(ByteArrayType.java:89)
      	at org.apache.cayenne.access.types.ExtendedTypeDecorator.materializeObject(ExtendedTypeDecorator.java:53)
      	at org.apache.cayenne.access.jdbc.reader.FullRowReader.readRow(FullRowReader.java:52)
      	at org.apache.cayenne.access.jdbc.reader.FullRowReader.readRow(FullRowReader.java:32)
      	at org.apache.cayenne.access.jdbc.JDBCResultIterator.nextRow(JDBCResultIterator.java:104)
      	at org.apache.cayenne.access.jdbc.JDBCResultIterator.allRows(JDBCResultIterator.java:80)
      	at org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:181)
      	at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97)
      	at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:302)
      	at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:439)
      	at org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:71)
      	at org.apache.cayenne.access.DataDomainQueryAction$2.perform(DataDomainQueryAction.java:412)
      	at org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:53)
      	at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:409)
      	at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:121)
      	at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:560)
      	at org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:744)
      	at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:552)
      	at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
      	at org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
      	at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
      	at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:985)
      	at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:974)
      

      Attachments

        Activity

          People

            SavvaKolbachev Savva Kolbachev
            Alex Kolonitsky Alex Kolonitsky
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: