Details
-
Task
-
Status: Open
-
Major
-
Resolution: Unresolved
-
4.0.M2
-
None
-
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)