[ 
http://issues.apache.org/jira/browse/JDO-263?page=comments#action_12362010 ] 

Craig Russell commented on JDO-263:
-----------------------------------

The way JPOX stores serialized data is found in org.jpox.store.rdbms.mapping. 
Blob2RDBMSMapping. The code that transforms BigDecimal[ ] for storage is:
                else if (value instanceof BigDecimal[ ])
                {
                    byte[ ] data = 
TypeConversionHelper.getByteArrayFromBigDecimalArray(value);
                    ((PreparedStatement) ps).setBytes(param, data);
                }

Looking at the code in JPOX org.jpox.util.TypeConversionHelper, we notice what 
appears to be a big problem.

    /**
     * Convert an instance of our value class into a byte[].
     *
     * @param value Object to be converted
     *
     * @return converted byte array
     */
    public static byte[] getByteArrayFromBigDecimalArray(Object value)
    {
        if (value == null)
        {
            return null;
        }

        BigDecimal[] a = (BigDecimal[]) value;
        double[] d = new double[a.length];

        for (int i=0; i < a.length; i++)
        {
            d[i] = a[i].doubleValue();
        }

        return getByteArrayFromDoubleArray(d);
    }    

It appears that to serialize a BigDecimal[ ] it would be better to avoid 
converting the BigDecimal[ ] to a double[ ]. Converting to a double[ ] is where 
the precision is lost. Some other techique for serializing BigDecimal[ ] is 
needed here.


> TestArrayCollections: Field 
> "org.apache.jdo.tck.pc.fieldtypes.ArrayCollections.ArrayOfObject1" is 
> declared as a reference type (interface/Object) but no implementation classes 
> of "java.lang.Object" have been found!
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: JDO-263
>          URL: http://issues.apache.org/jira/browse/JDO-263
>      Project: JDO
>         Type: Bug
>   Components: tck20
>     Reporter: Michelle Caisse
>     Assignee: Andy Jefferson
>  Attachments: jdo-263.patch
>
> test(org.apache.jdo.tck.models.fieldtypes.TestArrayCollections)javax.jdo.JDOUserException:
>  Field "org.apache.jdo.tck.pc.fieldtypes.ArrayCollections.ArrayOfObject1" is 
> declared as a reference type (interface/Object) but no implementation classes 
> of "java.lang.Object" have been found!
>       at 
> org.jpox.metadata.MetaDataUtils.getImplementationNamesForReferenceField(MetaDataUtils.java:594)
>       at 
> org.jpox.store.rdbms.table.ColumnCreator.createColumnsForReferenceField(ColumnCreator.java:184)
>       at 
> org.jpox.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:296)
>       at 
> org.jpox.store.rdbms.table.ColumnCreator.createColumns(ColumnCreator.java:95)
>       at org.jpox.store.rdbms.table.ArrayTable.initialize(ArrayTable.java:83)
>       at 
> org.jpox.store.rdbms.RDBMSManager$ClassAdder.addClassTablesAndValidate(RDBMSManager.java:2404)
>       at 
> org.jpox.store.rdbms.RDBMSManager$ClassAdder.run(RDBMSManager.java:2033)
>       at 
> org.jpox.store.rdbms.RDBMSManager$MgmtTransaction.execute(RDBMSManager.java:1893)
>       at org.jpox.store.rdbms.RDBMSManager.addClasses(RDBMSManager.java:479)
>       at org.jpox.store.rdbms.RDBMSManager.addClass(RDBMSManager.java:493)
>       at 
> org.jpox.store.rdbms.RDBMSManager.getDatastoreClass(RDBMSManager.java:766)
>       at 
> org.jpox.state.StateManagerImpl.populateStrategyFields(StateManagerImpl.java:781)
>       at org.jpox.state.StateManagerImpl.<init>(StateManagerImpl.java:584)
>       at 
> org.jpox.AbstractPersistenceManager.internalMakePersistent(AbstractPersistenceManager.java:1076)
>       at 
> org.jpox.AbstractPersistenceManager.makePersistent(AbstractPersistenceManager.java:1131)
>       at 
> org.apache.jdo.tck.models.fieldtypes.TestArrayCollections.runTest(TestArrayCollections.java:93)
>       at 
> org.apache.jdo.tck.models.fieldtypes.TestArrayCollections.test(TestArrayCollections.java:69)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:204)
>       at 
> org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:120)
>       at org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:95)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to